#子查询

子查询是指嵌套在另一个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                  
edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流