一、设置模拟用的模板表
create table info1 (id int,name varchar(10) primary key not null ,score decimal(5,2),address varchar(20),hobbid int(5));
insert into info1 values(1,'lily',80,'BA',2);
insert into info1 values(2,'haiyuon',90,'SL',2);
insert into info1 values(3,'sullyoon',60,'SL',4);
insert into info1 values(4,'jinni',99,'FS',5);
insert into info1 values(5,'bae',98,'AS',3);
insert into info1 values(6,'jiwoo',10,'SH',3);
insert into info1 values(7,'kuyjin',11,'NJ',5);
二、select 查询高级语句
1、按分数排序
mysql> select id,name,score from info order by score;
2、按分数降序排序
mysql> select id,name,score from info order by score desc;
3、order by 结合where进行条件过滤
mysql> select name,score from info where address='hangzhou' order by score desc;
筛选地址是杭州的学生按分数降序排列
ps:ORDER BY 语句也可以使用多个字段来进行排序,当排序的第一个字段相同的记录有多条的情况下,这些多条的记录再按照第二个字段进行排序,ORDER BY 后面跟多个字段时,字段之间使用英文逗号隔开,优先级是按先后顺序而定 但order by 之后的第一个参数只有在出现相同值时,第二个字段才有意义
4、AND/OR ——且/或
mysql> select * from info where score >70 and score <=90;
mysql> select * from ky19 where score >70 or score <=90;
嵌套/多条件:
mysql> select * from info where score >70 or (score >75 and score <90);
5、distinct 查询不重复记录
mysql> select distinct hobbid from info;
6、对结果进行分组
通过 SQL 查询出来的结果,还可以对其进行分组,使用 GROUP BY 语句来实现 ,GROUP BY 通常都是结合聚合函数一起使用的,常用的聚合函数包括:计数(COUNT)、 求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),GROUP BY 分组的时候可以按一个或多个字段对结果进行分组处理。
SELECT column_name, aggregate_function(column_name)FROM table_name WHERE column_name operator value GROUP BY column_name;
按hobbid相同的分组,计算相同分数的学生个数(基于name个数进行计数)
mysql> select count(name),hobbid from info group by hobbid;
结合where语句,筛选分数大于等于80的分组,计算学生个数
mysql> select count(name),hobbid from info where score>=80 group by hobbid;
结合order by把计算出的学生个数按升序排列
mysql> select count(name),score,hobbid from info where score>=80 group by hobbid order by count(name) asc;
7、limit 限制输出
查询所有信息显示前4行记录
mysql> select * from info limit 3;
从第4行开始,往后显示3行内容
mysql> select * from info limit 3,3;
基础select 小的升阶 怎么输出最后三行
mysql> select id,name from info order by id desc limit 3;
8.设置别名
在 MySQL 查询时,当表的名字比较长或者表内某些字段比较长时,为了方便书写或者 多次使用相同的表,可以给字段列或表设置别名。使用的时候直接使用别名,简洁明了,增强可读性
查询info表的字段数量,以number显示
mysql> select count(*) as number from info;
9、通配符
通配符主要用于替换字符串中的部分字符,通过部分字符的匹配将相关结果查询出来。
通常通配符都是跟 LIKE 一起使用的,并协同 WHERE
查询名字是l开头的记录
mysql> select id,name from info where name like 'l%';
查询名字里是l和i中间有一个字符的记录
mysql> select id,name from info where name like 'li_i';
查询地址以s开头的记录
mysql> select id,address from info where address like 's%_';
10、子查询
子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语 句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一 步的查询过滤。
多表查询
mysql> select id,name,score from info where id in (select * from ky23);
查询分数大于80的记录
mysql> select name,score from info1 where id in (select id from info1 where score>80);
DELETE 也适用于子查询
删除分数大于80的记录
mysql> delete from info where id in (select id where score>80);
三、MySQL视图
视图:可以被当作是虚拟表或存储查询。
- 视图跟表格的不同是,表格中有实际储存数据记录,而视图是建立在表格之上的一个架构,它本身并不实际储存数据记录。
- 临时表在用户退出或同数据库的连接断开后就自动消失了,而视图不会消失。
- 视图不含有数据,只存储它的定义,它的用途一般可以简化复杂的查询。 比如你要对几个表进行连接查询,而且还要进行统计排序等操作,写SQL语句会很麻烦的,用视图将几个表联结起来,然后对这个视图进行查询操作,就和对一个表查询一样,很方便。
CREATE VIEW "视图表名" AS "SELECT 语句"; #创建视图表
DROP VIEW "视图表名"; #删除视图表
单表创建
多表创建
修改原表数据
NULL 值
在 SQL 语句使用过程中,经常会碰到 NULL 这几个字符。通常使用 NULL 来表示缺失 的值,也就是在表中该字段是没有值的。如果在创建表时,限制某些字段不为空,则可以使用 NOT NULL 关键字,不使用则默认可以为空。在向表内插入记录或者更新记录时,如果该字段没有 NOT NULL 并且没有值,这时候新记录的该字段将被保存为 NULL。需要注意 的是,NULL 值与数字 0 或者空白(spaces)的字段是不同的,值为 NULL 的字段是没有 值的。在 SQL 语句中,使用 IS NULL 可以判断表内的某个字段是不是 NULL 值,相反的用 IS NOT NULL 可以判断不是 NULL 值。
四、表连接
MYSQL数据库中的三种连接:
- inner join(内连接):只返回两个表中联结字段相等的行(有交集的值)
- left join(左连接):返回包括左表中的所有记录和右表中联结字段相等的记录
- right join(右连接):返回包括右表中的所有记录和左表中联结字段相等的记录
语法:
SELECT column_name(s)FROM table1 INNER/LEFT/RIGHT JOIN table2 ON table1.column_name = table2.column_name;
1、左连接(left join)
select * from info1 left join info2 on info1.name=info2.name;
2、右连接 (RIGHT JOIN)
select * from info1 right join info2 on info1.name=info2.name;
1、内连接
select info1.id,info1.name from info1 inner join info2 on info1.name=info2.name;
五、存储过程
存储过程是一组为了完成特定功能的SQL语句集合。
存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。存储过程在执行上比传统SQL速度更快、执行效率更高。
存储过程的优点:
1、执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率。
2、SQL语句加上控制语句的集合,灵活性高。
3、在服务器端存储,客户端调用时,降低网络负载。
4、可多次重复被调用,可随时修改,不影响客户端调用。
5、可完成所有的数据库操作,也可控制数据库的信息访问权限。
创建与调用
delimiter $$
create procedure proc01 () #创建存储过程,过程名为proc01,不带参数
-> begin #过程体以关键字BEGIN开始
-> create table student(id int,name char(10),age int);
-> insert into student values(1,'zhangsan',18);
-> insert into student values(2,'lisi',18);
-> select * from student;
-> end $$ #过程体以关键字END结束
delimiter ; #将语句的结束符号恢复为分号
call proc01; #调用存储过程
show tables #查看变是否创建成功
select * from students; #查看表数据
查看存储过程
show create procedure proc01;
show create procedure proc01\G #查看存储过程的具体信息
show procedure status like '%Proc01%'\G
删除存储过程
存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。
drop procedure if exists proc01;
#仅当存在时删除,不添加If EXISTS 时,如果指定的过程不存在,则产生一个错误。
六、总结
1、select、order by limit的一个结合
对 MySQL 数据库的查询,除了基本的查询外,有时候需要对查询的结果集进行处理。 例如只取 10 条数据、对查询结果进行排序或分组等等。
使用 SELECT 语句可以将需要的数据从 MySQL 数据库中查询出来,如果对查询的结果进行排序,可以使用 ORDER BY 语句来对语句实现排序,并最终将排序后的结果返回给用户。这个语句的排序不光可以针对某一个字段,也可以针对多个字段
ORDER BY 语句也可以使用多个字段来进行排序,当排序的第一个字段相同的记录有多条的情况下,这些多条的记录再按照第二个字段进行排序,ORDER BY 后面跟多个字段时,字段之间使用英文逗号隔开,优先级是按先后顺序而定 但order by 之后的第一个参数只有在出现相同值时,第二个字段才有意义
limit 限制输出的结果记录 在使用 MySQL SELECT 语句进行查询时,结果集返回的是所有匹配的记录(行)。有时候仅 需要返回第一行或者前几行,这时候就需要用到 LIMIT 子句
2、对结果进行分组
通过 SQL 查询出来的结果,还可以对其进行分组,使用 GROUP BY 语句来实现 ,GROUP BY 通常都是结合聚合函数一起使用的,常用的聚合函数包括:计数(COUNT)、 求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),GROUP BY 分组的时候可以按一个或多个字段对结果进行分组处理。
SELECT column_name, aggregate_function(column_name)FROM table_name WHERE column_name operator value GROUP BY column_name;
3、表连接
- inner join(内连接):只返回两个表中联结字段相等的行(有交集的值)
- left join(左连接):返回包括左表中的所有记录和右表中联结字段相等的记录
- right join(右连接):返回包括右表中的所有记录和左表中联结字段相等的记录
4、存储过程
存储过程是一组为了完成特定功能的SQL语句集合。 存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。存储过程在执行上比传统SQL速度更快、执行效率更高。