子查询
概述
概念
- SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );
- 子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个。
分类
- 根据子查询结果不同,分为:
- 标量子查询(子查询结果为单个值)
- 列子查询(子查询结果为一列)
- 行子查询(子查询结果为一行)
- 表子查询(子查询结果为多行多列)
- 根据子查询位置,分为:
- WHERE之后
- FROM之后
- SELECT之后
标量子查询
- 子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。常用的操作符:= <> > >= < <=
案例:
查询 "销售部" 的所有员工信息完成这个需求时,我们可以将需求分解为两步:
- 查询 "销售部" 部门ID
select id from dept where name = '销售部';
- 根据 "销售部" 部门ID, 查询员工信息
select * from emp where dept_id = (select id from dept where name = '销售部');
查询在 "方东白" 入职之后的员工信息完成这个需求时,我们可以将需求分解为两步:
- 查询 方东白 的入职日期
select entrydate from emp where name = '方东白';
- 查询指定入职日期之后入职的员工信息
select * from emp where entrydate > (select entrydate from emp where name = '方东白');
列子查询
- 子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。
- 常用的操作符:IN 、NOT IN 、 ANY 、SOME 、 ALL
操作符 | 描述 |
IN | 在指定的集合范围之内,多选一 |
NOT IN | 不在指定的集合范围之内 |
ANY | 子查询返回列表中,有任意一个满足即可 |
SOME | 与ANY等同,使用SOME的地方都可以使用ANY |
ALL | 子查询返回列表的所有值都必须满足 |