一、介绍
子查询是指在一个 SQL 语句中嵌套另一个 SELECT 语句,从而实现更复杂的数据检索和处理。也被称为嵌套查询。
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
应用场景:子查询外部的语句可以是 INSERT、UPDATE、DELETE 或 SELECT 中的任何一种。
二、按结果类型分类
1、标量子查询
子查询返回的结果是单个值(一行一列) 通常用在 =、<、> 等比较运算符后
2、列子查询
子查询返回的结果是一列数据(可以是多行) 常用操作符:IN、NOT IN、ANY、SOME、ALL
| 操作符 | 描述 |
|---|---|
IN |
在指定的集合范围之内,多选一 |
NOT IN |
不在指定的集合范围之内 |
ANY |
子查询返回列表中,有任意一个满足即可 |
SOME |
与 ANY 等同,使用 SOME 的地方都可以使用 ANY |
ALL |
子查询返回列表的所有值都必须满足 |
3、 行子查询
子查询返回的结果是一行数据(可以是多列) 常用操作符:=、<>、IN、NOT IN
示例:查询与 "张无忌" 薪资及直属领导相同的员工信息
sql
SELECT * FROM emp WHERE (salary, managerid) = (SELECT salary, managerid FROM emp WHERE name = '张无忌');
三、 按出现位置分类
WHERE 之后:作为过滤条件的一部分,最常见的用法
FROM 之后:子查询结果作为一个临时表,供外层查询使用
SELECT 之后:子查询结果作为一个列的值返回
示例:
sql
查询财务部所有人员工资
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 = '财务部')
);
查询比研发部中任意一人工资高的员工信息
SELECT * FROM emp WHERE salary > SOME (
SELECT salary FROM emp WHERE dept_id = (SELECT id FROM dept WHERE name = '研发部')
);