5000年来最易看懂的MYSQL DQL语言
MYSQL 的查询语言——————DQL
一、DQL语言基本规则
①DQL(Data Query Language):数据查询语言,用来查询记录(数据)。
②数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。查询返回的结果集是一张虚拟表。
③查询语句书写和执行顺序
书写:select -from- where- group by- having- order by-limit
执行:from - where -group by -having - select - order by-limit
二、建立数据库表格
student表
student.png
score表
score.png
三、DQL基本语法
查询关键字:SELECT
1、基本查询:
SELECT * FROM student //查询student表的全部列
SELECT sno , sname FROM student //查询表格的某些列的全部信息
2、条件查询:
①select * from student where class = 95033;
1.png
其中“=”可换成 =、!=、<>(不等于)、<、<=、>、>=;等符号
“*”可换成我们想要显示的某些列
②select * from student where sno in ( 107,109);//sno等于107,109的信息
2.png
其他条件查询
select * from student where sno BETWEEN 107 AND 109;
select * from student where sno IS NULL;
select * from student where sno IS NULL and sno=107;
select * from student where sno IS NULL or sno=107;
select * from student where sno IS not NULL;
3、模糊查询
select * from student where sname like "王%";//以王开头的姓名
3.png
select * from student where sname like "%王%";//sanme中含有“王”字的信息
select * from student where sname like "_";//”_”表示单个字母
4、字段控制查询
(1) 去除重复记录
SELECT DISTINCT class FROM student;
(2) 相同类型字段可做运算,列名起别名,把NULL值换为0
SELECT class+IFNULL(sno,0) AS 小名 FROM student;//别名的AS可省略
4.png
(3)排序查询
SELECT * FROM student ORDER BY sno asc;//升序
SELECT * FROM student ORDER BY sno desc;//降序
SELECT * FROM student ORDER BY sno desc , class asc;//先sno降序,sno相同再按class升序
5、聚合函数(纵向运算)
COUNT():统计指定列不为NULL的记录行数;
SELECT count(1) FROM student ;
SELECT count(1) FROM student where sno=107;
MAX():计算指定列的最大值,如果指定列是字符串类型,使用字符串排序运算;
SELECT MAX(sno) FROM student ;
MIN():计算指定列的最小值,如果指定列是字符串类型,使用字符串排序运算;
SELECT MIN(sno) FROM student ;
SUM():计算指定列的数值和,如果指定列类型不是数值类型,计算结果为0;
SLECT SUM(sno) FROM student ;
AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
SELECT AVG(sno) FROM student ;
6、分组查询
1、凡和聚合函数同时出现的列名,则一定要写在group by 之后
SELECT class, count(1) FROM student group by class ;
2、对分组后限定的HAVING 子句
SELECT class, count(1) FROM student group by class HAVING count(1) >=2;
注:having与where的区别:
1.having是在分组后对数据进行过滤,where是在分组前对数据进行过滤
2.having后面可以使用分组函数(统计函数) where后面不可以使用分组函数。
3.WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;而 HAVING是对分组后数据的约束。
7、控制行数实现分页查询
若一页行数为10;
SELECT * FROM student LIMIT 0, 9;//从0行开始到第九行结束,为第一页数据。
四、多表查询
1、合并结果集(union , union all)
SELECT* FROM student UNION SELECT * FROM student;//去除重复数据
SELECT* FROM student UNION ALL SELECT * FROM student;//不去除重复数据
注:要合并的两表的列数、列类型必须相同。
2、连接查询
2.1内连接
特点:查询结果必须满足条件
SELECT * FROM student,score WHERE student.sno=score.sno ;(方言形式,可将*换成指定列)
SELECT * FROM student INNER JOIN score ON student.sno=score.sno ;(标准形式内连接)
2.2 外连接
特点:查询结果必须满足条件
①左连接是先查询出左表(以左表为主),然后查询右表,右表中满足条件的显示出来,不满足条件的显示 NULL。
SELECT * FROM student LEFT OUTER JOIN score ON student.sno=score.sno ;
②右连接就是先把右表中所有记录都查询出来,然后左表满足条件的显示,不满足显示NULL;
SELECT * FROM student RIGHT OUTER JOIN score ON student.sno=score.sno
3、子查询
定义及形式:一个select语句中包含另一个完整的select语句。 子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。
子查询出现的位置:
a. where后,作为条为被查询的一条件的一部分;
SELECT * FROM score WHERE degree > (SELECT degree FROM score WHERE cno='3-245' and sno=103);
b. from后,作表;
SELECT count(1) FROM (SELECT sno FROM score WHERE cno='3-245') test;
test为子查询表的别名。派生表必须有自己的别名;
c. 当子查询出现在where后作为条件且子查询形式为多行单列时,还可以使用如下关键字:
1.any
SELECT * FROM score WHERE sno = any(SELECT sno FROM score WHERE cno=’3-245’);
2.all
SELECT * FROM score WHERE degree< all(SELECT degree FROM score WHERE sno=103);
DQL语言到此告一段落,欲知其他内容,请听下回分解。