Z
ZHANK
编程在线教程SQL 教程CTE 公用表表达式
子查询与CTE

CTE 公用表表达式

使用 WITH 子句简化复杂查询、递归 CTE

CTE 公用表表达式

CTE(Common Table Expression)用 WITH 定义临时结果集,让复杂查询分步骤写,更好读更好维护。

学完本章你将: 掌握 WITH 基本用法、多 CTE、递归 CTE。


基本 CTE —— 给子查询起个名字

sql
-- 先定义"北京用户"
WITH beijing_users AS (
    SELECT * FROM users WHERE city = '北京'
)
-- 再用它查询
SELECT name, age FROM beijing_users WHERE age > 25;

等效于子查询,但名字清晰、可在后续多处引用。


多个 CTE

sql
WITH
    beijing_users AS (
        SELECT * FROM users WHERE city = '北京'
    ),
    user_orders AS (
        SELECT u.name, COUNT(o.id) AS order_count
        FROM beijing_users u
        LEFT JOIN orders o ON u.id = o.user_id
        GROUP BY u.id, u.name
    )
SELECT * FROM user_orders WHERE order_count > 3;

递归 CTE —— 处理树形结构

sql
-- 生成 1 到 10 的序列
WITH RECURSIVE numbers(n) AS (
    SELECT 1                    -- 初始值
    UNION ALL
    SELECT n + 1 FROM numbers WHERE n < 10  -- 递归
)
SELECT * FROM numbers;  -- 1,2,3,4,5,6,7,8,9,10
sql
-- 组织架构:查某员工的所有下属
WITH RECURSIVE subordinates AS (
    SELECT * FROM employees WHERE id = 1   -- 起点
    UNION ALL
    SELECT e.* FROM employees e
    INNER JOIN subordinates s ON e.manager_id = s.id
)
SELECT * FROM subordinates;