首页/数据/数据库速查/CTE(WITH 子句)与递归 CTE
SQL 语法52 条

CTE(WITH 子句)与递归 CTE

把复杂查询拆成可读的命名子查询;递归 CTE 用 WITH RECURSIVE 展开树形/层级数据(组织架构、分类、物料 BOM)。

数据库速查数据更新于 2026-10-12
用途查询结构化与递归展开
语法WITH name AS (SELECT …) SELECT …
递归WITH RECURSIVE cte AS (锚点 UNION ALL 递归部分)

基础 CTE

基础 CTE
WITH top_users AS (
  SELECT user_id, SUM(amount) AS total FROM orders GROUP BY user_id HAVING total > 10000
)
SELECT u.name, t.total FROM top_users t JOIN users u ON u.id = t.user_id;

递归展开层级

递归展开层级
WITH RECURSIVE tree AS (
  SELECT id, name, parent_id, 1 AS lvl FROM categories WHERE parent_id IS NULL
  UNION ALL
  SELECT c.id, c.name, c.parent_id, t.lvl + 1
  FROM categories c JOIN tree t ON c.parent_id = t.id
)
SELECT * FROM tree ORDER BY lvl, id;
递归 CTE 默认递归深度上限 cte_max_recursion_depth=1000(8.0),有环数据要先做防环处理。

易错点

  • CTE 只是语法糖,8.0 前子查询可能被物化,性能要实测而不是想当然
  • 递归写法的终止条件(锚点)出错会导致无限递归直到超限报错

数据来源与参考

  • MySQL 8.0 Reference Manual: WITH (Common Table Expressions)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌