摘要:本文学习了如何使用DQL语句查询数据。
环境
Windows 10 企业版 LTSC 21H2
MySQL 5.7.40
1 查询
查询数据:
sql1 2 3 4 5 6 7
| select [distinct] 列1 [as '别名1'], ..., 列n [as '别名n'] from 表名 [where 表达式] [group by 表达式] [having 表达式] [order by 表达式] [limit 起始编号, 查询条数];
|
说明:
- select:指定查询的字段,多个字段用
,
分隔,全部字段使用*
号代替,使用distinct
关键字对结果去重,使用as
关键字设置结果显示的别名,可以省略as
关键字。
- from:指定查询的表,可以是单个或多个,多个表名用
,
分隔。
- where:可选,指定查询的条件。
- group by:可选,指定对结果按哪些字段分组。
- having:可选,指定分组后查询的条件,用于使用聚合函数的查询条件。
- order by:可选,指定排序的方式,使用
asc
按升序排列,使用desc
按降序排列,默认按升序排列。
- limit:可选,指定查询的起始编号和查询条数,起始编号可以省略,默认从0开始查询。
查询虚拟表,虚拟表可以省略:
sql1 2 3 4 5 6 7 8 9
| mysql> select 1 + 1 as sum from dual; + | sum | + | 2 | + 1 row in set (0.00 sec)
mysql>
|
查询所有字段:
sql1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| mysql> select * from score; + | id | student | course | grade | + | 1 | 张三 | 计算机 | 98 | | 2 | 张三 | 英语 | 53 | | 3 | 李四 | 计算机 | 48 | | 4 | 李四 | 中文 | 38 | | 5 | 王五 | 中文 | 95 | | 6 | 赵六 | 计算机 | 70 | | 7 | 赵六 | 英语 | 92 | | 8 | 赵六 | 中文 | 73 | | 9 | 孙七 | 英语 | 94 | | 10 | 周八 | 计算机 | 90 | | 11 | 周八 | 英语 | 85 | | 12 | 吴九 | 计算机 | 90 | | 13 | 吴九 | 中文 | 55 | + 13 rows in set (0.05 sec)
mysql>
|
查询指定字段:
sql1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| mysql> select student, course, grade from score; + | student | course | grade | + | 张三 | 计算机 | 98 | | 张三 | 英语 | 53 | | 李四 | 计算机 | 48 | | 李四 | 中文 | 38 | | 王五 | 中文 | 95 | | 赵六 | 计算机 | 70 | | 赵六 | 英语 | 92 | | 赵六 | 中文 | 73 | | 孙七 | 英语 | 94 | | 周八 | 计算机 | 90 | | 周八 | 英语 | 85 | | 吴九 | 计算机 | 90 | | 吴九 | 中文 | 55 | + 13 rows in set (0.05 sec)
mysql>
|
查询课程并去重:
sql1 2 3 4 5 6 7 8 9 10 11
| mysql> select distinct course from score; + | course | + | 计算机 | | 英语 | | 中文 | + 3 rows in set (0.05 sec)
mysql>
|
查询指定字段并设置显示别名:
sql1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| mysql> select student '姓名', course '课程', grade '成绩' from score; + | 姓名 | 课程 | 成绩 | + | 张三 | 计算机 | 98 | | 张三 | 英语 | 53 | | 李四 | 计算机 | 48 | | 李四 | 中文 | 38 | | 王五 | 中文 | 95 | | 赵六 | 计算机 | 70 | | 赵六 | 英语 | 92 | | 赵六 | 中文 | 73 | | 孙七 | 英语 | 94 | | 周八 | 计算机 | 90 | | 周八 | 英语 | 85 | | 吴九 | 计算机 | 90 | | 吴九 | 中文 | 55 | + 13 rows in set (0.05 sec)
mysql>
|
查询指定条数的数据:
sql1 2 3 4 5 6 7 8 9 10 11 12 13
| mysql> select * from score limit 5; + | id | student | course | grade | + | 1 | 张三 | 计算机 | 98 | | 2 | 张三 | 英语 | 53 | | 3 | 李四 | 计算机 | 48 | | 4 | 李四 | 中文 | 38 | | 5 | 王五 | 中文 | 95 | + 5 rows in set (0.05 sec)
mysql>
|
查询课程的成绩并从高到低排序:
sql1 2 3 4 5 6 7 8 9 10 11 12
| mysql> select * from score where course = '中文' order by grade desc; + | id | student | course | grade | + | 5 | 王五 | 中文 | 95 | | 8 | 赵六 | 中文 | 73 | | 13 | 吴九 | 中文 | 55 | | 4 | 李四 | 中文 | 38 | + 4 rows in set (0.05 sec)
mysql>
|
查询成绩并按课程分组,最后计算每个课程的平均分:
sql1 2 3 4 5 6 7 8 9 10 11
| mysql> select course, avg(grade) from score group by course; + | course | avg(grade) | + | 中文 | 65.2500 | | 英语 | 81.0000 | | 计算机 | 79.2000 | + 3 rows in set (0.05 sec)
mysql>
|
查询成绩并按课程分组,最后计算每个课程的平均分,只显示平均分大于70的结果:
sql1 2 3 4 5 6 7 8 9 10
| mysql> select course, avg(grade) from score group by course having avg(grade) > 70; + | course | avg(grade) | + | 英语 | 81.0000 | | 计算机 | 79.2000 | + 2 rows in set (0.05 sec)
mysql>
|
查询计算机课程的成绩:
sql1 2 3 4 5 6 7 8 9 10 11 12 13
| mysql> select * from score where course = '计算机'; + | id | student | course | grade | + | 1 | 张三 | 计算机 | 98 | | 3 | 李四 | 计算机 | 48 | | 6 | 赵六 | 计算机 | 70 | | 10 | 周八 | 计算机 | 90 | | 12 | 吴九 | 计算机 | 90 | + 5 rows in set (0.05 sec)
mysql>
|
2 连接查询
2.1 内连接查询
内连接查询返回的是同时满足两个结果集的记录。
使用inner join
内连接两个表,可以省略inner
关键字。
查询学生信息以及计算机课程的成绩:
sql1 2 3 4 5 6 7 8 9 10 11 12 13 14
| mysql> select stu.*, sco.course, sco.grade -> from student stu -> join score sco on stu.name = sco.student and sco.course = '计算机'; + | id | name | sex | birth | department | address | course | grade | + | 101 | 张三 | 女 | 1990 | 中文系 | 湖南省永州市 | 计算机 | 98 | | 102 | 李四 | 男 | 1990 | 英语系 | 辽宁省阜新市 | 计算机 | 48 | | 106 | 周八 | 男 | 1986 | 中文系 | 北京市昌平区 | 计算机 | 90 | | 107 | 吴九 | 女 | 1996 | 中文系 | 湖北省武汉市 | 计算机 | 90 | + 4 rows in set (0.05 sec)
mysql>
|
结果仅显示有计算机课程成绩的记录,没有成绩的不显示。
2.2 外连接查询
外连接分为左外连接和右外连接,分别以左表和右表作为主表匹配,保留主表中存在的数据。
使用left join
建立左外连接,使用right join
建立右外连接。
查询学生信息以及计算机课程的成绩:
sql1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| mysql> select stu.*, sco.course, sco.grade -> from student stu -> left join score sco on stu.name = sco.student and sco.course = '计算机'; + | id | name | sex | birth | department | address | course | grade | + | 101 | 张三 | 女 | 1990 | 中文系 | 湖南省永州市 | 计算机 | 98 | | 102 | 李四 | 男 | 1990 | 英语系 | 辽宁省阜新市 | 计算机 | 48 | | 106 | 周八 | 男 | 1986 | 中文系 | 北京市昌平区 | 计算机 | 90 | | 107 | 吴九 | 女 | 1996 | 中文系 | 湖北省武汉市 | 计算机 | 90 | | 103 | 王五 | 女 | 1991 | 英语系 | 福建省厦门市 | NULL | NULL | | 104 | 王六 | 男 | 1988 | 计算机系 | 湖南省衡阳市 | NULL | NULL | | 105 | 孙七 | 男 | 1985 | 计算机系 | 北京市海淀区 | NULL | NULL | + 7 rows in set (0.05 sec)
mysql>
|
结果仅显示有计算机课程成绩的记录,没有成绩的数据使用Null表示。
3 子查询
子查询指一个查询语句嵌套在另一个查询语句内部的查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。
3.1 in子查询
in子查询主要用于判断指定字段的值是否存在于子查询的结果集中。
如果子查询的记录较少,主查询的记录较多时使用in,因为这时用到了主表上的索引。
查询所有英语系的学生成绩:
sql1 2 3 4 5 6 7 8 9 10 11
| mysql> select * from score where student in (select name from student where department = '英语系'); + | id | student | course | grade | + | 3 | 李四 | 计算机 | 48 | | 4 | 李四 | 中文 | 38 | | 5 | 王五 | 中文 | 95 | + 3 rows in set (0.05 sec)
mysql>
|
3.2 exists子查询
exists子查询主要用于判断子查询的结果集是否为空。
如果子查询的记录较多,主查询的记录较少时使用exists,因为这时用到了子表上的索引。
查询是否存在数学系的学生成绩:
sql1 2 3 4
| mysql> select * from score where exists (select id from student where department = '数学系'); Empty set (0.05 sec)
mysql>
|
查询是否存在英语系的学生成绩:
sql1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| mysql> select * from score sco where exists (select stu.id from student stu where stu.department = '英语系'); + | id | student | course | grade | + | 1 | 张三 | 计算机 | 98 | | 2 | 张三 | 英语 | 53 | | 3 | 李四 | 计算机 | 48 | | 4 | 李四 | 中文 | 38 | | 5 | 王五 | 中文 | 95 | | 6 | 赵六 | 计算机 | 70 | | 7 | 赵六 | 英语 | 92 | | 8 | 赵六 | 中文 | 73 | | 9 | 孙七 | 英语 | 94 | | 10 | 周八 | 计算机 | 90 | | 11 | 周八 | 英语 | 85 | | 12 | 吴九 | 计算机 | 90 | | 13 | 吴九 | 中文 | 55 | + 13 rows in set (0.05 sec)
mysql>
|
查询所有英语系的学生成绩:
sql1 2 3 4 5 6 7 8 9 10 11
| mysql> select * from score sco where exists (select stu.id from student stu where sco.student = stu.name and stu.department = '英语系'); + | id | student | course | grade | + | 3 | 李四 | 计算机 | 48 | | 4 | 李四 | 中文 | 38 | | 5 | 王五 | 中文 | 95 | + 3 rows in set (0.05 sec)
mysql>
|
3.3 比较运算符子查询
使用比较运算符判断子查询是否满足:
sql1 2 3 4 5 6 7 8 9 10
| mysql> select * from score sco where sco.student = (select stu.name from student stu where stu.id = 101); + | id | student | course | grade | + | 1 | 张三 | 计算机 | 98 | | 2 | 张三 | 英语 | 53 | + 2 rows in set (0.05 sec)
mysql>
|
条