子查询
子查询:SQL 语句中嵌套
SELECT语句,称为嵌套查询,又称子查询。
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
子查询外部的语句可以是 INSERT / UPDATE / DELETE / SELECT 的任何一个。
分类
| 按结果分类 | 子查询结果 |
|---|---|
| 标量子查询 | 单个值(数字、字符串、日期) |
| 列子查询 | 一列(可以是多行) |
| 行子查询 | 一行(可以是多列) |
| 表子查询 | 多行多列 |
按位置分类:WHERE 之后、FROM 之后、SELECT 之后。
示例数据沿用 多表查询 中的
emp/dept表。
一、标量子查询
子查询返回的结果是单个值,是最简单的形式,常用操作符:= <> > >= < <=
-- 1. 查询"销售部"的所有员工信息
SELECT id FROM dept WHERE name = '销售部'; -- a. 先查部门 ID
SELECT * FROM emp WHERE dept_id = (SELECT id FROM dept WHERE name = '销售部'); -- b. 再查员工
-- 2. 查询在"方东白"入职之后的员工信息
SELECT entrydate FROM emp WHERE name = '方东白'; -- a. 先查入职日期
SELECT * FROM emp WHERE entrydate > (SELECT entrydate FROM emp WHERE name = '方东白');
二、列子查询
子查询返回的结果是一列(可以是多行),常用操作符:
| 操作符 | 描述 |
|---|---|
IN | 在指定的集合范围之内,多选一 |
NOT IN | 不在指定的集合范围之内 |
ANY | 子查询返回列表中,有任意一个满足即可 |
SOME | 与 ANY 等同,使用 SOME 的地方都可以使用 ANY |
ALL | 子查询返回列表的所有值都必须满足 |
-- 1. 查询"销售部"和"市场部"的所有员工信息
SELECT id FROM dept WHERE name = '销售部' || name = '市场部';
SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE name = '销售部' || name = '市场部');
-- 2. 查询比财务部所有人工资都高的员工信息
SELECT salary FROM emp WHERE dept_id = (SELECT id FROM dept WHERE name = '财务部');
SELECT * FROM emp WHERE salary > ALL (SELECT salary FROM emp WHERE dept_id = (SELECT id FROM dept WHERE name = '财务部'));
-- 3. 查询比研发部其中任意一人工资高的员工信息
SELECT * FROM emp WHERE salary > ANY (SELECT salary FROM emp WHERE dept_id = (SELECT id FROM dept WHERE name = '研发部'));
三、行子查询
子查询返回的结果是一行(可以是多列),常用操作符:= <> IN NOT IN
-- 查询与"张无忌"的薪资及直属领导相同的员工信息
SELECT salary, managerid FROM emp WHERE name = '张无忌';
SELECT * FROM emp WHERE (salary, managerid) = (SELECT salary, managerid FROM emp WHERE name = '张无忌');
四、表子查询
子查询返回的结果是多行多列,常用操作符:IN
-- 1. 查询与"鹿杖客""宋远桥"的职位和薪资相同的员工信息
SELECT job, salary FROM emp WHERE name = '鹿杖客' || name = '宋远桥';
SELECT * FROM emp WHERE (job, salary) IN (SELECT job, salary FROM emp WHERE name = '鹿杖客' || name = '宋远桥');
-- 2. 查询入职日期是"2006-01-01"之后的员工信息,及其部门信息(子查询放在 FROM 之后当临时表)
SELECT * FROM (SELECT * FROM emp WHERE entrydate > '2006-01-01') e
LEFT JOIN dept d ON e.dept_id = d.id;
五、速查
| 类型 | 结果形态 | 常用操作符 | 典型写法 |
|---|---|---|---|
| 标量子查询 | 单个值 | = <> > >= < <= | WHERE 字段 = (SELECT ...) |
| 列子查询 | 一列多行 | IN / NOT IN / ANY / ALL | WHERE 字段 IN (SELECT ...) |
| 行子查询 | 一行多列 | = / IN | WHERE (字段1, 字段2) = (SELECT ...) |
| 表子查询 | 多行多列 | IN | FROM (SELECT ...) 别名 JOIN ... |
相关
- 多表查询(连接查询):内连接 / 外连接 / 自连接 / 联合查询
- 多表查询案例:12 道综合练习题与答案
- SQL - DQL:条件 / 聚合 / 分组 / 排序 / 分页