讲师中心 微信公众号
AI工具推荐 视频效率加速

mysql8.0公共表表达式CTE怎么写_递归查询与复杂逻辑简化

小婷酱_9840

小婷酱_9840

发布时间:2026-04-29 15:49:28

|

890人浏览过

|

来源于php中文网

原创

MySQL 8.0中CTE必须以WITH(递归需WITH RECURSIVE)为最外层前缀,仅支持SELECT/INSERT/UPDATE/DELETE前直接使用;禁止嵌套子查询、漏写RECURSIVE、用UNION DISTINCT或在LEFT JOIN右表引用递归CTE。

mysql8.0公共表表达式cte怎么写_递归查询与复杂逻辑简化

WITH 是 MySQL 8.0 引入 CTE 的唯一入口,不支持低版本的模拟写法。如果你在 MySQL 5.7 或更早版本里试图用 WITH,会直接报错 ERROR 1064 (42000) —— 这不是语法写错了,是版本不支持。

普通 CTE 怎么写才不报错

最常踩的坑是把 WITH 放在 SELECT 后面、或者嵌套在子查询里。CTE 必须作为整个语句的**最外层前缀**,且只能紧挨着第一个 SELECT / INSERT / UPDATE / DELETE。

正确写法示例:

WITH recent_sales AS (
  SELECT order_id, customer_id, amount
  FROM orders
  WHERE order_date >= '2025-01-01'
)
SELECT customer_id, SUM(amount) AS total
FROM recent_sales
GROUP BY customer_id;

错误写法(常见):

  • SELECT * FROM (WITH t AS (...) SELECT ...) s; —— CTE 不能出现在子查询中
  • SELECT ..., (WITH t AS (...) SELECT ...) FROM ...; —— 不支持标量子查询里用 WITH
  • 漏写列别名但子查询字段含表达式,如 WITH t AS (SELECT id+1) SELECT * FROM t; —— MySQL 要求显式命名列或依赖子查询自动推导(有风险)

递归 CTE 必须加 RECURSIVE 关键字

MySQL 对递归 CTE 的语法比标准 SQL 更严格:WITH RECURSIVE 是强制的,漏掉 RECURSIVE 就算逻辑再对也会报错 ERROR 1223 (HY000): Can't execute the query because it contains recursion。

锚定部分(非递归)和递归部分必须用 UNION ALL 连接,UNION DISTINCT 在递归 CTE 中被禁止(即使语法上允许,执行时会失败)。

递归部分只能引用一次 CTE 名,并且**只能出现在 FROM 或 JOIN 子句中**;不能出现在 WHERE 的子查询里,也不能在 LEFT JOIN 的右表位置 —— 否则触发 ERROR 3641 (HY000): Recursive reference to CTE 'xxx' is not allowed in this context。

示例(查某员工的所有下属):

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
WITH RECURSIVE subordinates AS (
  SELECT emp_id, name, manager_id
  FROM employees
  WHERE manager_id = 333  -- 锚定:直属下属
  UNION ALL
  SELECT e.emp_id, e.name, e.manager_id
  FROM employees e
  INNER JOIN subordinates s ON e.manager_id = s.emp_id  -- 仅此处可引用
)
SELECT * FROM subordinates;

CTE 能不能代替临时表或视图

能,但要看场景。CTE 是**语句级临时结果集**,只在当前查询生命周期内存在,不生成物理对象,也不缓存结果 —— 所以多次引用同一个 CTE(比如在 JOIN 里用了两次),MySQL 默认会重复执行其定义子查询(除非优化器判定可复用)。

对比:

  • 临时表(CREATE TEMPORARY TABLE):显式物化,可加索引,适合多步操作或大数据量中间结果
  • 视图(CREATE VIEW):持久化定义,无数据存储,每次调用都重执行底层查询
  • CTE:轻量、不可索引、作用域最小,适合提升单个复杂查询的可读性与逻辑分层

性能提示:如果 CTE 子查询本身很重(如全表扫描 + 多表 JOIN),又在主查询中被多次引用,不如先写进临时表。MySQL 8.0 不支持 CTE 物化提示(如 MATERIALIZED),也暂无等价于 PostgreSQL 的 NOT MATERIALIZED 控制开关。

递归深度超限怎么办

MySQL 默认递归上限是 1000 层(由系统变量 cte_max_recursion_depth 控制)。如果树太深(比如组织架构超过千级),会报错 ERROR 3636 (HY000): Recursive query aborted after 1001 iterations。

临时调高方法(需有 SUPER 权限):

SET SESSION cte_max_recursion_depth = 2000;

但要注意:这不是万能解。过深递归会导致栈膨胀、内存占用陡增,甚至触发 OOM。真正该做的,是检查是否真的需要遍历全部层级 —— 很多业务场景其实只需 3~5 层(如“我的直属、我的下属的下属”),这时可以在递归 WHERE 条件里加层数控制:

WITH RECURSIVE tree AS (
  SELECT id, name, manager_id, 1 AS level
  FROM employees WHERE id = 333
  UNION ALL
  SELECT e.id, e.name, e.manager_id, t.level + 1
  FROM employees e
  INNER JOIN tree t ON e.manager_id = t.id
  WHERE t.level < 5  -- 主动截断
)
SELECT * FROM tree;

递归 CTE 的真实难点不在语法,而在如何避免无限循环和合理剪枝 —— 锚定查询必须确保不返回空集,递归条件必须保证最终收敛,否则查询会卡死或超时。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

3089

2023.06.20

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2288

2023.07.25

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

1220

2023.08.02

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1178

2023.08.09

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

1336

2023.09.05

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2118

2023.09.20

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

3380

2023.09.20

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

15275

2023.09.22

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

80

2026.10.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 183人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn