#子查询
子查询是指嵌套在另一个SQL语句(例如SELECT、FROM、WHERE、HAVING)中的查询。它可以返回单行、单列、多行或多列数据,用于动态生成过滤条件、计算字段或临时数据集。
通常,子查询可以分为非关联子查询(又称为“静态子查询”)、关联子查询和标量子查询。
| 类型 | 是否依赖外部查询 | 返回结果 | 典型场景 |
|---|---|---|---|
| 非关联子查询 | 否 | 单行/多行/多列 | IN、EXISTS、比较运算 |
| 关联子查询 | 是 | 单行/多行/多列 | EXISTS、NOT EXISTS |
| 标量子查询 | 均可 | 单行单列 | SELECT列表、WHERE |
# 非关联子查询(Non-Correlated Subquery)
# 定义
独立于外部查询,且不依赖外部查询的列或值,仅执行一次,然后将结果传递给外部查询。
# 特点
- 执行顺序:先子查询,后外部查询。
- 常见于IN、EXISTS、比较运算符等场景。
# SQL示例
-- 查询入职时间在中位数之后的员工
SELECT employee_no, employee_name, entry_date
FROM employees
WHERE entry_date > (
SELECT MEDIAN(entry_date)
FROM employees
);
EMPLOYEE_NO EMPLOYEE_NAME ENTRY_DATE
------------- ------------- ------------------------------------------------
0201010011 Anna 2024-05-11
0201008004 Jim 2024-08-19
# 关联子查询(Correlated Subquery)
# 定义
子查询中引用了外部查询的列,需要依赖外部查询的结果,外部查询每处理一行,子查询执行一次。
# 特点
- 执行顺序:外部查询逐行执行,子查询循环匹配。
- 常见于EXISTS、NOT EXISTS等场景。
# SQL示例
SELECT employee_no, employee_name
FROM employees e1
WHERE EXISTS (
SELECT 1
FROM employees e2
WHERE e2.employee_no = e1.employee_no
);
EMPLOYEE_NO EMPLOYEE_NAME
------------- -------------
0101000001 Mask
0101000002 John
0201008003 Jack
0201008004 Jim
0201010011 Anna
# 标量子查询(Scalar Subquery)
# 定义
返回单行单列(标量值)的子查询,可在SQL中像常量一样使用。
# 特点
- 必须确保返回唯一行。
- 常见于SELECT列表、WHERE条件等位置。
# SQL示例
-- 显示员工入职时间及其部门中位数入职时间
SELECT
employee_no,
employee_name,
entry_date,
(SELECT MEDIAN(entry_date) FROM employees e2
WHERE e2.department = e1.department) AS dept_avg_entry_date
FROM employees e1;
EMPLOYEE_NO EMPLOYEE_NAME ENTRY_DATE DEPT_AVG_ENTRY_DATE
------------- ------------- ------------------------------------------------ ------------------------------------------------
0101000001 Mask 2022-06-11 2021-01-27
0101000002 John 2019-09-15 2021-01-27
0201010011 Anna 2024-05-11 2024-05-11
0201008003 Jack 2023-04-07 2023-12-13
0201008004 Jim 2024-08-19 2023-12-13

