news 2026/5/10 14:35:07

MySQL - CTE 表达式(公用表表达式):简化复杂查询的新姿势

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL - CTE 表达式(公用表表达式):简化复杂查询的新姿势

MySQL CTE(Common Table Expression,公用表表达式)
是 MySQL 8.0(2018 年)引入的重要特性,极大提升了复杂查询的可读性、可维护性和复用性。

2026 年,几乎所有新项目和中大型系统都强烈推荐使用 CTE 来替代之前的子查询嵌套、临时表、自连接等写法。

一、CTE 到底解决了什么痛点?

写法对比传统子查询 / 派生表写法使用 CTE 后的写法优势
可读性多层嵌套,括号层层套娃,很难一眼看懂像写函数一样,先定义再引用,结构清晰★★★★★
代码复用同一个子查询要重复写多次定义一次,多次引用★★★★★
递归查询几乎不可能(需要存储过程或循环)原生支持 WITH RECURSIVE★★★★★
调试难度改一层要检查所有嵌套层可以单独 SELECT 每个 CTE 来验证★★★★☆
性能大多数情况下差不多(优化器会重写)部分场景略好(物化 CTE 在 8.0.18+ 更智能)≈ 或略优

二、CTE 基本语法(必须记住的模板)

WITHcte_name1AS(SELECT...-- 第一个公用表表达式),cte_name2AS(SELECT...FROMcte_name1WHERE...)SELECT...FROMcte_name2JOINcte_name1ON...WHERE...;

关键点

  • WITH 写在 SELECT 之前
  • 多个 CTE 用逗号分隔
  • 后面的 CTE 可以引用前面的 CTE(顺序重要)
  • 最后一个 CTE(或主查询)引用前面的

三、5 种最常见使用场景 + 代码示例(生产级)

1. 简化多层嵌套子查询(最常见用途)

需求:查询每个部门工资高于部门平均工资的员工

-- 传统写法(嵌套多层,可读性差)SELECTe1.*FROMemployees e1WHEREsalary>(SELECTAVG(salary)FROMemployees e2WHEREe2.dept_id=e1.dept_id);-- CTE 写法(清晰得多)WITHdept_avgAS(SELECTdept_id,AVG(salary)ASavg_salaryFROMemployeesGROUPBYdept_id)SELECTe.*FROMemployees eJOINdept_avg dONe.dept_id=d.dept_idWHEREe.salary>d.avg_salary;
2. 同一子查询多次使用(避免重复计算)
WITHrecent_ordersAS(SELECTorder_id,customer_id,order_dateFROMordersWHEREorder_date>=DATE_SUB(CURDATE(),INTERVAL30DAY))SELECTc.customer_name,COUNT(ro.order_id)ASorder_count,MAX(ro.order_date)ASlast_order_dateFROMcustomers cLEFTJOINrecent_orders roONc.customer_id=ro.customer_idGROUPBYc.customer_id,c.customer_name;
3. 层级 / 递归查询(组织架构、评论回复、分类树等)

经典场景:查询员工及其所有下属(递归)

WITHRECURSIVE employee_hierarchyAS(-- 锚点成员(起点)SELECTemployee_id,name,manager_id,1ASlevelFROMemployeesWHEREmanager_idISNULL-- 最高领导UNIONALL-- 递归部分SELECTe.employee_id,e.name,e.manager_id,eh.level+1FROMemployees eINNERJOINemployee_hierarchy ehONe.manager_id=eh.employee_id)SELECTemployee_id,name,manager_id,levelFROMemployee_hierarchyORDERBYlevel,name;
4. 分步计算复杂指标(报表常用)
WITHsales_by_dayAS(SELECTDATE(order_date)ASsale_date,SUM(amount)ASdaily_salesFROMordersGROUPBYDATE(order_date)),moving_avgAS(SELECTsale_date,daily_sales,AVG(daily_sales)OVER(ORDERBYsale_dateROWSBETWEEN6PRECEDINGANDCURRENTROW)ASmoving_7d_avgFROMsales_by_day)SELECT*FROMmoving_avgWHEREsale_date>='2025-12-01';
5. CTE 作为临时结果集 + 分页 / 去重 / 排名
WITHranked_productsAS(SELECTp.*,ROW_NUMBER()OVER(PARTITIONBYcategory_idORDERBYsalesDESC)ASrnFROMproducts p)SELECT*FROMranked_productsWHERErn<=3;-- 每个品类销量前 3

四、MySQL 8.0+ CTE 重要特性与限制(2026 年须知)

特性 / 限制说明
支持递归 CTEWITH RECURSIVE(组织树、路径、图遍历等)
CTE 可多次引用一个 CTE 被主查询和其它 CTE 多次使用
CTE 可物化(Materialized CTE)8.0.18+ 优化器可能自动物化,重复使用时性能更好
不支持在 CTE 内使用 LIMIT除非在子查询中再包一层(常见绕法)
CTE 不能是 UPDATE/DELETE 的目标表只能用于 SELECT(MySQL 限制,8.4 仍未放开)
递归深度默认限制1000 层(cmax_recursion_depth 可调,但慎用)

五、2026 年生产建议总结(一句话版)

凡是子查询出现两次以上、嵌套超过两层、需要递归、报表分步计算,都优先考虑用 CTE 重写。

推荐进阶学习顺序

  1. 普通 CTE(简化子查询)
  2. 多 CTE 组合 + 窗口函数
  3. WITH RECURSIVE(层级、路径、树)
  4. CTE + 窗口函数 + 聚合函数的复杂报表
  5. 观察 explain analyze 是否物化 CTE(性能调优)

有具体业务场景想用 CTE 重写吗?
贴出你现在的 SQL,我帮你改成更优雅的 CTE 版本。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 7:21:44

MinerU如何对接数据库?结构化入库部署案例

MinerU如何对接数据库&#xff1f;结构化入库部署案例 MinerU 2.5-1.2B 是一款专为 PDF 文档深度解析设计的开源工具&#xff0c;尤其擅长处理学术论文、技术手册、财报等含多栏布局、嵌套表格、数学公式和矢量图的复杂文档。但很多用户在完成 PDF→Markdown 的高质量提取后&a…

作者头像 李华
网站建设 2026/5/1 14:09:50

从云游戏到Mac远程操控:UU远程游戏、办公场景全覆盖

从云游戏到 Mac 远程操控&#xff1a;网易 UU 远程全场景覆盖详解&#xff08;2026 年最新实测视角&#xff09; 网易 UU 远程&#xff08;原 GameViewer 远程&#xff09;是网易旗下的专业远程控制工具&#xff0c;已成为 2026 年国内用户在远程游戏 远程办公双场景中最受欢…

作者头像 李华
网站建设 2026/5/2 22:28:40

【大数据毕设全套源码+文档】基于Django+hadoop的零食销售大数据分析及可视化系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/1 16:11:22

升级你的AI绘画工具箱:Z-Image-Turbo优势全解析

升级你的AI绘画工具箱&#xff1a;Z-Image-Turbo优势全解析 1. 为什么你需要重新认识“文生图”这件事 你有没有过这样的体验&#xff1a; 输入一段精心打磨的提示词&#xff0c;点击生成&#xff0c;然后盯着进度条数秒、十几秒、甚至半分钟——最后出来的图&#xff0c;细节…

作者头像 李华
网站建设 2026/5/1 9:21:43

Z-Image-Turbo快速上手:三步完成文生图服务部署实战

Z-Image-Turbo快速上手&#xff1a;三步完成文生图服务部署实战 1. 为什么Z-Image-Turbo值得你花5分钟试试&#xff1f; 你是不是也遇到过这些情况&#xff1a;想用AI画张图&#xff0c;结果等了两分钟才出第一帧&#xff1b;好不容易跑起来&#xff0c;发现中文提示词根本不…

作者头像 李华
网站建设 2026/5/10 9:41:33

cv_unet_image-matting Alpha阈值设置多少合适?多场景实战解析

cv_unet_image-matting Alpha阈值设置多少合适&#xff1f;多场景实战解析 1. 为什么Alpha阈值是抠图效果的关键开关&#xff1f; 你可能已经发现&#xff0c;在cv_unet_image-matting的WebUI里&#xff0c;「Alpha阈值」这个参数看起来平平无奇&#xff0c;就一个0-50的滑块…

作者头像 李华