测试必备的Mysql常用sql语句系列
https://www.cnblogs.com/poloyy/category/1683347.html
前言
- 子查询在我们查询方法中是比较常用的,通过子查询可以实现多表查询
- 子查询是指:将一个查询语句嵌套在另一个查询语句中
- 子查询可以在select、update、delete语句中使用,还可以进行多层嵌套
子查询的语法格式
WHERE<表达式><操作符> (子查询)
语法格式说明
- 操作符可以是比较运算符、in、not in、exists、not exists
- not 当然就是取反啦
in 和 exists的一个比较
先看看dept、emp表有什么数据
dept表
比较运算符的栗子
查询部门是销售部的员工信息
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 表查询 depte_id 在上面 id 结果集的记录
select*from emp where dept_id in (select id from dept where name = "财务部" or name ="销售部")
not in 的栗子
select*from emp where dept_id notin (select id from dept where name = "财务部" or name ="销售
其实就是上面栗子结果集的取反
exists 栗子
SQL分析
- 从 dept 表中查询 id = 1 的记录,若有,exists 表达式则返回True
- 外层查询语句接收到 True 之后,对 emp 表进行查询,返回所有记录
select*from emp whereexists(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 whereexists (select*from dept where id =1) and dept_id =2
知识点
- 子查询的功能其实通过表连接(join)也可以完成
- 一般来说,表连接(内连接、外连接等)都可以用子查询查询,但反过来却不一定,有的子查询不能用表连接来替换
- 子查询比较灵活,适合作为查询的筛选条件
- 表连接更适合查看连接表之后的数据集