- 子查询在我们查询方法中是比较常用的,通过子查询可以实现多表查询
- 子查询是指:将一个查询语句嵌套在另一个查询语句中
- 子查询可以在 select ,update,delete 语句中使用,还可以进行多层嵌套
WHERe <表达式> <操作符> (子查询)
语法格式说明
- 操作符可以是比较运算符,in,not in,exists,not exists
- not 当然就是取反了
| in | exists |
|---|---|
| 当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE; | 用于判断子查询的结果集是否为空,若子查询的结果集不为空,返回 TRUE,否则返回 FALSE; |
| 适合外表大而内表小的情况 | 适合内表大而外表小的情况 |
| 无论哪个表大,用 not exists 都比 not in 速度快 | |
| 1、A是表达式,B是子查询结果集2、若A在B里面,则返回True | |
| 方便理解,画个图 |
SELECT * FROM emp WHERe dept_id = (SELECt id FROM dept WHERe `name` = '销售部')查询部门不是销售部的员工信息
SELECt * FROM emp WHERe dept_id <> (SELECt id FROM dept WHERe name = '销售部');in 的例子 SQL分析
- 从 dept 表查询部门名字为销售部 or 财务部的部门id
- 然后从 emp 表 查询 dept_ id 在上面 id 结果集的记录
SELECt * FROM emp WHERe dept_id IN (SELECt id FROM dept WHERe name = '销售部' OR name = '财务部');
可以看看子查询SQL的运行结果
SELECt id FROM dept WHERe name = '销售部' OR name = '财务部';
最终的SQL其实是这样的
SELECt * FROM emp WHERe dept_id IN (1,3);not in 的例子
SELECt * FROM emp WHERe dept_id NOT IN (SELECt id FROM dept WHERe name = '销售部' OR name = '财务部');
其实就上面例子结果集取反
exists 例子 SQL分析- 从 dept 表中查询 id = 1 的记录,若有,exists 表达式则返回 True
- 外层查询语句接受到 True 之后,对 emp 表进行查询,返回所有记录
SELECt * FROM emp WHERe EXISTS (SELECt * FROM dept WHERe id = 1);
可以看看 exists 表达式里的子查询结果集
SELECt * FROM dept WHERe id = 1;
可以看到,结果集不为空,所以 exists() 返回 True
最终的SQL其实是这样的
SELECt * FROM emp WHERe TRUE;exists + 其他查询条件的例子
SELECt * FROM emp WHERe EXISTS (SELECt * FROM dept WHERe id = 1) AND dept_id = 2;知识点
- 子查询的功能其实通过表连接 (join)也可以完成
- 一般来说,表连接(内连接,外连接等)都可以通过子查询查询,但反过来却不一定,有的子查询不能用表连接来替换
- 子查询比较灵活,适合作为查询的筛选条件
- 表连接更适合查看连接表之后的数据集



