嵌套查询下层的程序模块,当一个查询是另一个查询的条件时,称之为子查询
一条select语句中,嵌入了另一条select语句
主要的查询对象,第一条select语句,确定所获取的数据目标(数据源)
1、按功能分
2、按位置分
查询结果是一个数据(一行一列)
mysql> select * from my_student;
+—-+——–+———-+——+——–+
| id | name | class_id | age| gender |
+—-+——–+———-+——+——–+
|1 | 刘备 |1 | 18 |2 |
|2 | 李四 |1 | 19 |1 |
|3 | 王五 |2 | 20 |2 |
|4 | 张飞 |2 | 21 |1 |
|5 | 关羽 |1 | 22 |2 |
|6 | 曹操 |1 | 20 | NULL |
+—-+——–+———-+——+——–+
mysql> select * from my_class;
+—-+——–+
| id | name |
+—-+——–+
|1 | 一班 |
|3 | 三班 |
|2 | 二班 |
+—-+——–+
select class_id from my_student where id = 1;
+———-+
| class_id |
+———-+
|1 |
+———-+
select * from my_class where id = (
select class_id from my_student where id = 1
);
+—-+——–+
| id | name |
+—-+——–+
|1 | 一班 |
+—-+——–+
列子查询得到的结果是一列数据,一列多行
主查询 where 条件 in (列子查询)
select distinct(class_id) from my_student;
+———-+
| class_id |
+———-+
|1 |
|2 |
+———-+
select name from my_class where id in (
select distinct(class_id) from my_student
);
+——–+
| name |
+——–+
| 一班 |
| 二班 |
+——–+
行子查询返回的结果是一行多列
主查询 where 条件 [(构造一个行元素)] = (行子查询);
获取班级年龄最大,且班级号最大的学生
select max(age), max(class_id) from my_student;
+———-+—————+
| max(age) | max(class_id) |
+———-+—————+
| 22 | 2 |
+———-+—————+
select * from my_student where (age, class_id) = (
select max(age), max(class_id) from my_student
);
Empty set (0.01 sec)
select * from my_student where (age, class_id) = (
select max(age), min(class_id) from my_student
);
+—-+——–+———-+——+——–+
| id | name | class_id | age| gender |
+—-+——–+———-+——+——–+
|5 | 关羽 |1 | 22 |2 |
+—-+——–+———-+——+——–+
总结:
标量子查询、列子查询、行子查询都属于where子查询
表子查询返回结果是多行多列,与行子查询相似
行子查询需要行元素,表子查询没有
获取每个班级年龄最大的学生:
— 错误示例返回结果只有0或者1,1代表成立,0代表不成立
mysql> select id from my_class;
+—-+
| id |
+—-+
|1 |
|3 |
|2 |
+—-+
主查询 where 条件 in (列子查询)
select * from my_student where class_id in (select id from my_class);select * from my_student where class_id = any (select id from my_class);
+—-+——–+———-+——+——–+
| id | name | class_id | age| gender |
+—-+——–+———-+——+——–+
|1 | 刘备 |1 | 18 |2 |
|2 | 李四 |1 | 19 |1 |
|3 | 王五 |2 | 20 |2 |
|4 | 张飞 |2 | 21 |1 |
|5 | 关羽 |1 | 22 |2 |
|6 | 曹操 |1 | 20 | NULL |
+—-+——–+———-+——+——–+
— 不等于任意一个
主查询 where 条件 any <> (列子查询)
select * from my_student where class_id <> any (select id from my_class);
+—-+——–+———-+——+——–+
| id | name | class_id | age| gender |
+—-+——–+———-+——+——–+
|1 | 刘备 |1 | 18 |2 |
|2 | 李四 |1 | 19 |1 |
|3 | 王五 |2 | 20 |2 |
|4 | 张飞 |2 | 21 |1 |
|5 | 关羽 |1 | 22 |2 |
|6 | 曹操 |1 | 20 | NULL |
+—-+——–+———-+——+——–+
与any完全一样
如果值为null,不参与匹配
mysql> select * from my_student;mysql> select * from my_student where class_id = any (select id from my_class);
+—-+——–+———-+——+——–+
| id | name | class_id | age| gender |
+—-+——–+———-+——+——–+
|1 | 刘备 |1 | 18 |2 |
|2 | 李四 |1 | 19 |1 |
|3 | 王五 |2 | 20 |2 |
|4 | 张飞 |2 | 21 |1 |
|6 | 曹操 |1 | 20 | NULL |
+—-+——–+———-+——+——–+
mysql> select * from my_student where class_id <> any (select id from my_class);
+—-+——–+———-+——+——–+
| id | name | class_id | age| gender |
+—-+——–+———-+——+——–+
|1 | 刘备 |1 | 18 |2 |
|2 | 李四 |1 | 19 |1 |
|3 | 王五 |2 | 20 |2 |
|4 | 张飞 |2 | 21 |1 |
|6 | 曹操 |1 | 20 | NULL |
+—-+——–+———-+——+——–+
到此这篇关于MySQL数据库子查询 sub query的文章就介绍到这了,更多相关MySQL sub query内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!