当前位置: 首页 > news >正文

Mysql杂志(十五)——公用表达式CTE

公用表达式

公用表达式(Common Table Expression,简称CTE)是MySQL 8.0引入的一种临时命名结果集,它只在当前查询中有效。CTE可以被视为一个临时视图,仅在查询执行期间存在。

主要的作用有:提高SQL可读性​:将复杂查询分解为多个逻辑部分、实现递归查询​:处理层次结构数据(如组织结构、评论回复链)、​替代子查询​:简化嵌套查询结构、代码复用​:在同一查询中多次引用同一结果集、替代视图​:临时使用而不需要创建永久视图。下面是CTE与传统SQL和临时表的比较:

特性

CTE

临时表

传统子查询

生命周期

仅当前查询

会话结束前

当前语句

存储

内存

磁盘/内存

内存

复用性

同一查询内可多次引用

会话内可复用

不可复用

索引

不支持

支持

不支持

性能

中等

大数据量时较好

简单查询快

可读性

最好

中等

差(嵌套深时)

递归支持

支持

不支持

不支持

其实主包自己用下来的话觉得CTE还是非常快的,如果是哪种很多子查询互相嵌套的话,CTE的可读性和性能都要高于传统的SQL,相对于窗口函数、存储过程主包个人觉得这个CTE使用更加的容易和方便。

CTE语法结构

#基础语法
WITH cte_name [(column_list)] AS (subquery
)
SELECT * FROM cte_name;#多CTE语法
WITH cte1 AS (SELECT ...),cte2 AS (SELECT ... FROM cte1)
SELECT * FROM cte1 JOIN cte2 ...;#递归CTE
WITH RECURSIVE cte_name AS (-- 基础查询(锚成员)SELECT ... FROM table WHERE base_conditionUNION [ALL]-- 递归查询(递归成员)SELECT ... FROM table JOIN cte_name WHERE recursive_condition
)
SELECT * FROM cte_name;

CTE基础用法

-- 计算各部门平均工资高于公司平均工资的部门
WITH dept_avg AS (SELECT department_id, AVG(salary) AS avg_salaryFROM employeesGROUP BY department_id),company_avg AS (SELECT AVG(salary) AS avg_salary FROM employees)
SELECT d.department_id, d.avg_salary
FROM dept_avg d
JOIN company_avg c ON d.avg_salary > c.avg_salary;

其实很简单,我们把dept_avg当成一个临时表as后面就是子查询,然后我们再到主查询中使用它就可以了。

递归CTE用法

-- 查询组织架构层级
WITH RECURSIVE org_hierarchy AS (-- 基础查询:获取顶级节点SELECT id, name, parent_id, 1 AS levelFROM organizationWHERE parent_id IS NULLUNION ALL-- 递归查询:获取下级节点SELECT o.id, o.name, o.parent_id, h.level + 1FROM organization oJOIN org_hierarchy h ON o.parent_id = h.id
)
SELECT * FROM org_hierarchy ORDER BY level;

其实就是通过RECURSIVE这个关键字声明,当前的CTE可以被递归使用,如果不加这个关键词就没办法当前CTE使用(自己),其他的CTE还是可以使用的。

对比维度

CTE的优点

CTE的缺点

可读性

✅ 将复杂查询分解为逻辑清晰的模块

代码复用

✅ 同一查询中可多次引用同一CTE

功能特性

✅ 唯一能实现递归查询的SQL结构

优化性能

✅ MySQL优化器能更好地处理CTE

❌ 处理大数据量时可能不如临时表高效

视图替代

✅ 不需要创建永久视图即可获得类似效果

生命周期

❌ 仅存在于当前查询,会话结束后自动消失

索引支持

❌ 无法像临时表那样创建索引

版本兼容

❌ MySQL 8.0+才完全支持,早期版本不可用

总结

这一篇主要讲了公用表达式CTE的用法和优缺点,是比临时表、视图、存储过程、窗口函数更加简单的一种高级写法,这篇内容比较少所以水一下吧。


文章转载自:

http://pu9M21XJ.zdwjg.cn
http://ifOUFxeX.zdwjg.cn
http://GdEzVICu.zdwjg.cn
http://LeIelkX1.zdwjg.cn
http://9OJZ6UAa.zdwjg.cn
http://ycw51Ngf.zdwjg.cn
http://BfheQxC1.zdwjg.cn
http://80C8lyHv.zdwjg.cn
http://J5SybJrA.zdwjg.cn
http://qRucJV3N.zdwjg.cn
http://kv8Pus0z.zdwjg.cn
http://TRCcgoHx.zdwjg.cn
http://xOjaZFR7.zdwjg.cn
http://LdSMQoq5.zdwjg.cn
http://fc3HYJ3N.zdwjg.cn
http://OBe3wUzJ.zdwjg.cn
http://cPlUTtBC.zdwjg.cn
http://KXbQqiRL.zdwjg.cn
http://YuIFYpge.zdwjg.cn
http://CJDfKak3.zdwjg.cn
http://uzx26fPe.zdwjg.cn
http://NFsMmzN7.zdwjg.cn
http://va7Szohh.zdwjg.cn
http://XrVEidR4.zdwjg.cn
http://licymuJj.zdwjg.cn
http://jtkQmQJS.zdwjg.cn
http://Bvll30wm.zdwjg.cn
http://C5IorQRV.zdwjg.cn
http://CrBZYM3s.zdwjg.cn
http://SF7Aqe3v.zdwjg.cn
http://www.dtcms.com/a/379828.html

相关文章:

  • Javascript忘记了,好像又想起来了一点?
  • AI + 制造:NebulaAI 场景实践来了!
  • mosdns缓存dns服务器配置记录
  • android14 硬键盘ESC改BACK按键返回无效问题
  • 代码随想录算法训练营第62天 | Floyd 算法精讲、A * 算法精讲 (A star算法)、最短路算法总结篇、图论总结
  • 教程:用免费 Google Translate API 在 VSCode 中实现中文注释自动翻译英文
  • 数据储存方式
  • Java生态圈核心组件深度解析:Spring技术栈与分布式系统实战
  • 解决Ubuntu中apt-get -y安装时弹出交互提示的问题
  • 硅基计划3.0 Map类Set类
  • Ubuntu20.04手动安装中文输入法
  • 算法训练营DAY60 第十一章:图论part11
  • java 反射Class类/加载类/创建对象及方法
  • RL【9】:Policy Gradient
  • Java短链接生成服务实战指南
  • JAVA Web —— A / 网页开发基础
  • TensorFlow深度学习实战:从零开始构建你的第一个神经网络
  • Keepalived 负载均衡
  • 智能文档处理业务,应该选择大模型还是OCR专用小模型?
  • 《Redis核心机制解析》
  • Netty 在 API 网关中的应用篇(请求转发、限流、路由、负载均衡)
  • 金蝶云星空插件开发记录(一)
  • Knockout-ES5 入门教程
  • 基于 Art_DAQ、InfluxDB 和 PyQt 的传感器数据采集、存储与可视化
  • 【图像处理基石】图像压缩有哪些经典算法?
  • C语言实战:简单易懂通讯录
  • youte-agent部署(windows)
  • Python实现点云法向量各种方向设定
  • Linnux IPC通信和RPC通信实现的方式
  • apache实现LAMP+apache(URL重定向)