https://www.cnblogs.com/poloyy/category/1683347.html
前言
子查询的语法格式
WHERE <表达式> <操作符> (子查询)
语法格式说明
- 操作符可以是比较运算符、in、not in、exists、not exists
- not 当然就是取反啦
in 和 exists的一个比较
in | exists |
当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE; | 用于判断子查询的结果集是否为空,若子查询的结果集不为空,返回 TRUE,否则返回 FALSE; |
适合外表大而内表小的情况 | 适合内表大而外表小的情况 |
无论哪个表大,用 not exists 都比 not in 速度快 |
|
1、A是表达式,B是子查询结果集 2、若A在B里面,则返回True |
|
方便理解,画个图 |
先看看dept、emp表有什么数据
dept表
emp表
比较运算符的栗子
查询部门是销售部的员工信息
select * from emp where dept_id = (select id from dept where name = "销售部")
查询部门不是销售部的员工信息
<> (= "销售部")
in 的栗子
sql分析
in (= "财务部" or name ="销售部")
可以看看子查询 sql 的查询结果
="销售部"
最终的 sql 其实是这样的
in (1,3)
not in 的栗子
not ="销售部")
其实就是上面栗子结果集的取反
exists 栗子
sql分析
where exists(where id = 1)
可以看看 exists 表达式里的子查询结果集
1
可以看到,查询结果集不为空,所以 exists() 返回 true
最终的 sql 其实是这样的
where true
exists + 其他查询条件的栗子
exists (1) and dept_id 2