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;