mysql WITH的多种用法与示例

在 MySQL 中,WITH语句(或称为公用表表达式,Common Table Expressions,简称 CTE)用于定义一个临时结果集,可以在查询的其他部分中重复引用。通常用在复杂查询中,方便将查询逻辑分解为多个部分,代码更清晰,并且可以重复使用中间结果。

MySQL 支持两种类型的 CTE:

  1. 非递归 CTE:基本的WITH语句,用于定义一次性计算的结果集。
  2. 递归 CTE:CTE 自己引用自己,通常用于分层数据或树状结构的查询。

下面分别介绍它们的用法和一些常见示例。

1. 非递归 CTE

非递归 CTE 在查询中定义一个固定的结果集,在执行后不会再改变。语法如下:

WITH cte_name AS ( SELECT ... ) SELECT * FROM cte_name;

示例 1:计算部门员工的平均工资

假设有一个employees表,包含员工的department_idnamesalary

WITH dept_avg_salary AS ( SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id ) SELECT e.name, e.salary, d.avg_salary FROM employees e JOIN dept_avg_salary d ON e.department_id = d.department_id WHERE e.salary > d.avg_salary;

这个查询首先用WITH计算各部门的平均工资(dept_avg_salary),然后找出工资高于部门平均工资的员工。

示例 2:按条件拆分查询

假设要找到销售额最高的 5 位销售人员,可以使用 CTE 进行临时排名:

WITH ranked_sales AS ( SELECT name, sales_amount, ROW_NUMBER() OVER (ORDER BY sales_amount DESC) AS rank FROM sales_team ) SELECT name, sales_amount FROM ranked_sales WHERE rank <= 5;

CTEranked_sales生成了一个带排名的销售记录表,然后主查询从中提取前五名。

2. 递归 CTE

递归 CTE 允许在定义时引用自身,常用于层级结构的查询,比如管理层次结构、树形结构等。语法如下:

WITH RECURSIVE cte_name AS ( SELECT ... -- 初始查询 UNION ALL SELECT ... FROM cte_name -- 递归查询 ) SELECT * FROM cte_name;
示例 3:计算阶乘

下面是一个递归 CTE 示例,计算 1 到 5 的阶乘。

WITH RECURSIVE factorial_cte AS ( SELECT 1 AS n, 1 AS factorial UNION ALL SELECT n + 1, factorial * (n + 1) FROM factorial_cte WHERE n < 5 ) SELECT * FROM factorial_cte;

这个 CTE 首先定义了n=1factorial=1的初始值,然后递归地计算 1 到 5 的阶乘。

示例 4:查询部门的层级结构

假设有一个departments表,每个部门都有一个idparent_id(指向上级部门)。递归 CTE 可以查询从某个部门开始的所有子部门。

WITH RECURSIVE dept_hierarchy AS ( SELECT id, name, parent_id FROM departments WHERE id = 1 -- 从根部门 ID 为 1 开始 UNION ALL SELECT d.id, d.name, d.parent_id FROM departments d JOIN dept_hierarchy h ON d.parent_id = h.id ) SELECT * FROM dept_hierarchy;
3. 嵌套 CTE 和多 CTE 定义

在一个查询中可以定义多个 CTE,并在查询的其他部分引用它们。这些 CTE 可以相互引用,按顺序处理。

示例 5:多个 CTE 的嵌套查询

假设要查询一组数据的中间计算结果,可以使用嵌套 CTE:

WITH initial_sales AS ( SELECT salesperson_id, SUM(sales_amount) AS total_sales FROM sales GROUP BY salesperson_id ), ranked_sales AS ( SELECT salesperson_id, total_sales, RANK() OVER (ORDER BY total_sales DESC) AS sales_rank FROM initial_sales ) SELECT salesperson_id, total_sales, sales_rank FROM ranked_sales WHERE sales_rank <= 10;

这里,initial_sales计算每个销售人员的总销售额,ranked_sales对销售额进行排名,然后主查询获取前十名销售人员。

4. 使用 CTE 简化复杂查询逻辑
示例 6:复杂查询的分步计算

假设有一个电商订单系统,要求统计每月每个产品的销售额及增长率。

WITH monthly_sales AS ( SELECT product_id, DATE_FORMAT(order_date, '%Y-%m') AS month, SUM(sales_amount) AS total_sales FROM orders GROUP BY product_id, month ), sales_growth AS ( SELECT m1.product_id, m1.month, m1.total_sales, (m1.total_sales - m2.total_sales) / m2.total_sales AS growth_rate FROM monthly_sales m1 LEFT JOIN monthly_sales m2 ON m1.product_id = m2.product_id AND DATE_FORMAT(DATE_SUB(m1.month, INTERVAL 1 MONTH), '%Y-%m') = m2.month ) SELECT * FROM sales_growth;

这个查询使用两个 CTE:monthly_sales计算每月的总销售额,sales_growth计算月销售增长率。

总结

WITH语句的多种用法总结如下:

  1. 非递归 CTE用于分解复杂查询。
  2. 递归 CTE用于层级数据查询。
  3. 嵌套 CTE可以组合多个步骤的查询。
  4. 简化查询逻辑:分解复杂的 SQL 逻辑,使查询更清晰易懂。

CTE 是复杂查询中不可或缺的工具,有助于使代码简洁且易于维护。

WITH RECURSIVE 举例说明,表结构是id和pid的指向 大概有五层

示例:递归查询部门层级

假设有一个departments表,结构如下:

  • id: 部门 ID
  • name: 部门名称
  • pid: 父级部门 ID(顶级部门的pidNULL

表中有五层嵌套的部门数据:

id

name

pid

1

公司

NULL

2

技术部

1

3

市场部

1

4

开发组

2

5

测试组

2

6

前端开发

4

7

后端开发

4

8

大客户市场部

3

9

中小客户市场部

3

递归 CTE 查询:获取指定部门的所有下级部门

我们可以使用递归 CTE 从根部门(例如公司层级的id=1)开始,查询所有子部门并显示层级关系。

wITH RECURSIVE dept_hierarchy AS ( -- 初始查询,获取顶级部门(这里我们从 id=1 的公司开始) SELECT id, name, pid, 1 AS level FROM departments WHERE id = 1 -- 这里可以更改为要查询的根部门的 ID UNION ALL -- 递归查询:找到上级部门(父级)的下一级部门 SELECT d.id, d.name, d.pid, h.level + 1 AS level FROM departments d JOIN dept_hierarchy h ON d.pid = h.id ) SELECT * FROM dept_hierarchy;
查询结果解释

这个递归 CTE 分为两部分:

  1. 初始查询SELECT id, name, pid, 1 AS level,从指定的部门(id=1)开始,将其层级设为1。
  2. 递归查询:从上级部门的id(即h.id)出发,查找其所有下级部门,并将level加 1,这样层级关系会递归增长,直到没有下级部门。

执行后,结果显示部门的层级关系:

id

name

pid

level

1

公司

NULL

1

2

技术部

1

2

3

市场部

1

2

4

开发组

2

3

5

测试组

2

3

6

前端开发

4

4

7

后端开发

4

4

8

大客户市场部

3

3

9

中小客户市场部

3

3

在这个查询中,level列表示部门的层级,从1开始递增。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1125605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

导师推荐!MBA毕业论文必备!10款AI论文写作软件TOP10测评

导师推荐&#xff01;MBA毕业论文必备&#xff01;10款AI论文写作软件TOP10测评 2026年MBA论文写作工具测评&#xff1a;为何需要一份专业榜单&#xff1f; 随着人工智能技术的不断发展&#xff0c;AI写作工具已成为MBA学生撰写毕业论文的重要辅助工具。然而&#xff0c;面对市…

MySQL 启动失败 (code=exited, status=1FAILURE) 异常解决方案

目录 前言1. 问题描述2. 查看错误日志文件 2.1 确认日志文件路径2.2 查看日志文件内容 3. 定位问题 3.1 问题分析 4. 解决问题 4.1 注释掉错误配置4.2 重启 MySQL 服务 5. 总结结语 前言 在日常运维和开发过程中&#xff0c;MySQL数据库的稳定运行至关重要。然而&#xff0c…

RAP:无需显式匹配,配准任意3D点云数据!

0. 论文信息标题&#xff1a;Register Any Point: Scaling 3D Point Cloud Registration by Flow Matching作者&#xff1a;Yue Pan, Tao Sun, Liyuan Zhu, Lucas Nunes, Iro Armeni, Jens Behley, Cyrill Stachniss机构&#xff1a;University of Bonn、Stanford University原…

mysql SQL子查询(史上最详细)

一、什么事子查询 SQL子查询&#xff08;Subquery&#xff09;是嵌套在其他SQL查询中的查询。 子查询可以用在SELECT、INSERT、UPDATE、DELETE语句中&#xff0c;以及在WHERE子句、HAVING子句或FROM子句中。 子查询可以返回一个值、一列值或多行多列值&#xff0c;根据这些返回…

技术债务管理:AI时代的代码质量

技术债务管理&#xff1a;AI时代的代码质量 关键词&#xff1a;技术债务管理、AI时代、代码质量、软件开发、债务识别、债务偿还 摘要&#xff1a;本文聚焦于AI时代下的技术债务管理与代码质量问题。在软件开发不断演进的过程中&#xff0c;技术债务的积累对项目的可维护性和可…

什么是品牌全域电商代运营?

当前电商行业已进入全域竞争深水区&#xff0c;流量分散化、渠道多元化、用户需求个性化成为常态&#xff0c;传统单一平台代运营因渠道割裂、资源分散等问题&#xff0c;已难以支撑品牌全链路增长需求。品牌全域电商代运营顺势升级&#xff0c;通过整合多渠道资源、贯通全链路…

mysql in查询大数据量业务无法避免情境下优化

在 MySQL 中&#xff0c;IN 查询操作广泛用于从数据库中检索符合条件的多条记录&#xff0c;但当涉及到大数据量的 IN 查询时&#xff0c;性能可能会显著下降。特别是当 IN 子句中的元素数量非常大时&#xff0c;MySQL 需要对每个元素进行匹配&#xff0c;这会导致查询变得非常…

mybatis plus打印sql日志

1、官方文档 使用配置 | MyBatis-Plus 2、日志实现 MyBatis-Plus 提供了多种日志实现&#xff08;log-impl&#xff09;&#xff0c;用于记录 SQL 语句和相关操作&#xff0c;帮助开发者进行调试和监控数据库操作。以下是一些可用的日志实现及其说明&#xff1a; StdOutImpl…

专业的TP公司主要是做什么的呢?

TP&#xff08;Tmall Partner&#xff0c;天猫合作伙伴&#xff09;公司是经天猫等主流电商平台官方认证的专业代运营机构&#xff0c;凭借对平台规则的深度掌控、成熟的运营方法论与丰富的资源储备&#xff0c;成为品牌布局天猫等核心电商渠道的重要战略伙伴。在品牌线上化竞争…

强烈安利8个AI论文网站,MBA论文写作必备!

强烈安利8个AI论文网站&#xff0c;MBA论文写作必备&#xff01; 1.「千笔」—— 一站式学术支持“专家”&#xff0c;从初稿到降重一步到位&#xff08;推荐指数&#xff1a;★★★★★&#xff09;对于MBA学生而言&#xff0c;论文写作不仅是学术能力的体现&#xff0c;更是时…

材料电性能检测仪器的原理、演进与工程应用

材料电性能检测的核心是通过仪器精确测量介电常数&#xff08;ε&#xff09;和介质损耗角正切值&#xff08;tanδ&#xff09;&#xff0c;这些参数直接反映材料的绝缘性能、能量损耗和高频适应性。其原理基于电桥法、谐振法或阻抗法&#xff0c;通过施加交流电场并测量材料的…

第1-2章 数据分析流程及Numpy科学计算

第一章 数据分析流程 数据分析完整流程 数据收集→数据清洗→数据分析→数据可视化 数据分析核心三件套 Numpy Pandas Matplotlib 第二章 Numpy科学计算 Numpy介绍 Python 中科学计算的基础包&#xff0c;提供多维数组对象、各种派生对象&#xff08;掩码数组和矩阵等&#xff…

Linux下安装Nginx服务及systemctl方式管理nginx详情

1.安装依赖包 yum一件安装所需的依赖包 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 2.下载nginx压缩包 在Nginx官网下载nginx(Index of /download/)&#xff0c;更具自己想要的版本下载相应的tar.gz包 3.创建目录 在Linux环境下创建一个安装目录…

【架构设计】Agentic AI提示工程驱动的个性化推荐系统:微服务拆分策略

Agentic AI提示工程驱动的个性化推荐系统&#xff1a;微服务拆分策略与实践 一、引言&#xff1a;为什么传统推荐系统需要"Agent化"重构&#xff1f; 1. 一个真实的痛点&#xff1a;传统推荐系统的"僵化"困境 假设你是某电商平台的用户&#xff1a; 你最近…

Mysql ONLY_FULL_GROUP_BY模式详解、group by非查询字段报错

文章目录 一、问题报错二、ONLY_FULL_GROUP_BY模式 2.1、什么是ONLY_FULL_GROUP_BY&#xff1f;2.2、为什么要使用ONLY_FULL_GROUP_BY&#xff1f;2.3、查看sql_mode 三、解决方法 3.1、关闭only_full_group_by模式 3.1.1、方法一&#xff1a;关闭当前会话中的only_full_group…

Thinkphp和Laravel框架的西安工商学院学生请假管理系统_s4hrg6g5

目录ThinkPHP与Laravel框架的西安工商学院学生请假管理系统项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理ThinkPHP与Laravel框架的西安工商学院学生请假管理系统 该系统基于ThinkPHP或Laravel框架开发&#xff0c;旨在为西安工商学院提供高效的…

小迪安全2023-2024|第13天:信息打点-Web应用源码泄漏开源闭源指纹识别GITSVND_笔记|web安全|渗透测试|网络安全_2023-2024

第13天&#xff1a;信息打点-Web应用&源码泄漏&开源闭源&指纹识别&GIT&SVN&D_笔记 一、信息打点 00:00 1. 业务资产 03:42 1&#xff09;应用类型分类 开源应用: 定义: 指能够从网上直接下载或已公开的程序源码特点: 通常发布在主流源码平台&#xff0…

Linux下启动redis

一、直接启动redis 使用这种启动方式需要一直打开窗口&#xff0c;不能进行其他操作&#xff0c;按 ctrl c可以关闭窗口。 [rootxxx ~]# cd /usr/local/redis-4.0.6/src [rootxxx src]# ./redis-server二、以后台进程形式启动redis ①设置redis.conf中daemonize为yes&#xff…

从普通产品经理到AI产品经理,你需要掌握的AI思维与核心技能:AI大模型产品经理从零基础到进阶

AI产品经理与普通产品经理的核心区别在于AI思维。人工智能产业链分为基础层、技术层和应用层。AI产品经理可分为突破型、创新型、应用型和普及型四类&#xff0c;需找准定位&#xff0c;避免常见误区。提升能力需专注目标领域&#xff0c;持续学习&#xff0c;扩大交流圈&#…

一文读懂监督、无监督、自监督与半监督学习:小白到大模型必备知识

文章系统介绍机器学习的四大范式&#xff1a;监督学习依赖标注数据训练模型&#xff1b;无监督学习挖掘数据内在特征完成任务&#xff1b;半监督学习结合少量标注和大量无标签数据提升性能&#xff1b;自监督学习通过设计辅助任务从无标签数据中生成监督信号。这些方法各有特点…