在本教程中,您将了解MySQL递归CTE(公共表表达式)以及如何使用它来遍历分层数据。

自MySQL 8.0版以来简要介绍了公共表表达式或叫CTE的功能,因此需要您在计算机上安装MySQL 8.0,以便在本教程中练习本语句。

1. MySQL递归CTE简介

递归是一个具有引用CTE名称本身的子查询的CTE。以下说明递归CTE的语法 –

WITH RECURSIVE cte_name AS ( initial_query -- anchor member UNION ALL recursive_query -- recursive member that references to the CTE name ) SELECT * FROM cte_name;

递归CTE由三个主要部分组成:

形成CTE结构的基本结果集的初始查询(initial_query),初始查询部分被称为锚成员。

递归查询部分是引用CTE名称的查询,因此称为递归成员。递归成员由一个或UNION DISTINCT运算符与锚成员相连。

终止条件是当递归成员没有返回任何行时,确保递归停止。

递归CTE的执行顺序如下:

首先,将成员分为两个:锚点和递归成员。

接下来,执行锚成员形成基本结果集(R0),并使用该基本结果集进行下一次迭代。

然后,将Ri结果集作为输入执行递归成员,并将Ri+1作为输出。

之后,重复第三步,直到递归成员返回一个空结果集,换句话说,满足终止条件。

最后,使用UNION ALL运算符将结果集从R0到Rn组合。

2. 递归成员限制

递归成员不能包含以下结构:

聚合函数,如,,,,等

子句

子句

子句

请注意,上述约束不适用于锚定成员。 另外,只有在使用UNION运算符时,要禁止DISTINCT才适用。 如果使用UNION DISTINCT运算符,则允许使用DISTINCT。

另外,递归成员只能在其子句中引用CTE名称,而不是引用任何。

3. 简单的MySQL递归CTE示例

请参阅以下简单的递归CTE 示例:

WITH RECURSIVE cte_count (n) AS ( SELECT 1 UNION ALL SELECT n + 1 FROM cte_count WHERE n < 3 ) SELECT n FROM cte_count;

在此示例中,以下查询:

SELECT 1

是作为基本结果集返回1的锚成员。

以下查询 –

SELECT n + 1 FROM cte_count WHERE n < 3

是递归成员,因为它引用了cte_count的CTE名称。

递归成员中的表达式<3是终止条件。当n等于3,递归成员将返回一个空集合,将停止递归。

下图显示了上述CTE的元素:

递归CTE返回以下输出:

递归CTE的执行步骤如下:

首先,分离锚和递归成员。

接下来,锚定成员形成初始行(SELECT 1),因此第一次迭代在n = 1时产生1 + 1 = 2。

然后,第二次迭代对第一次迭代的输出(2)进行操作,并且在n = 2时产生2 + 1 = 3。

之后,在第三次操作(n = 3)之前,满足终止条件(n <3),因此查询停止。

最后,使用UNION ALL运算符组合所有结果集1,2和3。

4. 使用MySQL递归CTE遍历分层数据

我们将使用中的employees表进行演示。

mysql> desc employees; +----------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+--------------+------+-----+---------+-------+ | employeeNumber | int(11) | NO | PRI | NULL | | | lastName | varchar(50) | NO | | NULL | | | firstName | varchar(50) | NO | | NULL | | | extension | varchar(10) | NO | | NULL | | | email | varchar(100) | NO | | NULL | | | officeCode | varchar(10) | NO | MUL | NULL | | | reportsTo | int(11) | YES | MUL | NULL | | | jobTitle | varchar(50) | NO | | NULL | | +----------------+--------------+------+-----+---------+-------+ 8 rows in set

employees表具有引用employeeNumber字段的reportsTo字段。 reportsTo列存储经理的ID。总经理不会向公司的组织结构中的任何人报告,因此reportsTo列中的值为。

您可以应用递归CTE以自顶向下的方式查询整个组织结构,如下所示:

WITH RECURSIVE employee_paths AS ( SELECT employeeNumber, reportsTo managerNumber, officeCode, 1 lvl FROM employees WHERE reportsTo IS NULL UNION ALL SELECT e.employeeNumber, e.reportsTo, e.officeCode, lvl+1 FROM employees e INNER JOIN employee_paths ep ON ep.employeeNumber = e.reportsTo ) SELECT employeeNumber, managerNumber, lvl, city FROM employee_paths ep INNER JOIN offices o USING (officeCode) ORDER BY lvl, city;

让我们将查询分解成更小的部分,使其更容易理解。首先,使用以下查询形成锚成员:

SELECT employeeNumber, reportsTo managerNumber, officeCode FROM employees WHERE reportsTo IS NULL

此查询(锚成员)返回reportTo为NULL的总经理。

其次,通过引用CTE名称来执行递归成员,在这个示例中为 employee_paths:

SELECT e.employeeNumber, e.reportsTo, e.officeCode FROM employees e INNER JOIN employee_paths ep ON ep.employeeNumber = e.reportsTo

此查询(递归成员)返回经理的所有直接上级,直到没有更多的直接上级。 如果递归成员不返回直接上级,则递归停止。

第三,使用employee_paths的查询将CTE返回的结果集与offices表结合起来,以得到最终结果集合。

以下是查询的输出:

在本教程中,您已经了解了MySQL递归CTE以及如何使用它来遍历分层数据。

¥ 我要打赏 纠错/补充 收藏

mysql 单标递归_MySQL递归CTE(公共表表达式)相关推荐

  1. mysql cte_MySQL CTE(公共表表达式)

    在本教程中,您将学习如何使用MySQL CTE或公用表表达式以更可读的方式构建复杂查询. 自MySQL 8.0版以来简要介绍了公共表表达式或叫CTE的功能,因此需要您在计算机上安装MySQL 8.0, ...

  2. 【数据库】CTE(Common Table Expression(公共表表达式))

    公用表表达式(CTE)的定义 公用表达式的定义包含三部分: 公用表表达式的名字(在WITH之后) 所涉及的列名(可选) 一个SELECT语句(紧跟AS之后), 公用表表达式的好处之一是可以在接下来一条 ...

  3. cte公用表表达式_SQL Server公用表表达式(CTE)

    cte公用表表达式 什么是通用表表达式 (What is a Common Table Expression ) A Common Table Expression, also called as C ...

  4. cte公用表表达式_SQL Server中的CTE; 使用公用表表达式解决重新编制标识符列的问题

    cte公用表表达式 Since we know that the SQL CTE (common table expression) offers us a tool to group and ord ...

  5. cte公用表表达式_CTE SQL删除; 在SQL Server中删除具有公用表表达式的数据时的注意事项

    cte公用表表达式 In this article, the latest in our series on Common table expressions, we'll review CTE SQ ...

  6. cte公用表表达式_SQL Server中的CTE; 查询公用表表达式

    cte公用表表达式 Common table expressions (CTEs) in SQL Server provide us with a tool that allows us to des ...

  7. cte公用表表达式_在SQL Server中使用CTE进行插入和更新(公用表表达式)

    cte公用表表达式 In CTEs in SQL Server; Querying Common Table Expressions the first article of this series, ...

  8. mysql父子节点分层_mysql 递归实例 父子节点层级递归

    在Oracle中可以使用CONNECT  BY子句可以轻松的实现递归查询,在MSSQLServer和DB2中则可以使用WITH子句来实现递归查询,MYSQL中即不支持CONNECT  BY子句也不支持 ...

  9. mysql cte的好处_Mysql 8 重要新特性 - CTE 通用表表达式

    前言 Mysql 8 正式发布了,新增了很多优秀特性,之后我会挑些重点来分享. 下面和大家一起熟悉下CTE(Common Table Expressions)通用表表达式. CTE 是什么 派生表大家 ...

最新文章

  1. EM算法 大白话讲解 没看懂 保存
  2. Java 注解详解 (annotation)
  3. redis使用sysc超时_基于redis的分布式锁实现
  4. 点击弹出窗口外任意地方关闭弹出窗口
  5. CodeForces - 1459C Row GCD(数论+推公式)
  6. ip访问php $_files空,PHP中表单没有问题但$_FILES为空怎么办?
  7. JavaScript学习随记——错误类型
  8. Windows server 2012 之路由功能
  9. 第一个python爬虫_Python爬虫01——第一个小爬虫
  10. IntelliJ IDEA 2020.2 正式发布,真香!
  11. tensorflow出现 ImportError: DLL load failed: 找不到指定的程序
  12. 【kubernetes系列之安装Dashboard】
  13. 实现视频播放器倍速、清晰度切换、m3u8下载功能
  14. Awvs 12.x安装及使用教程
  15. PHP实现PayPal支付对接
  16. [踩坑记录]VS2017+大恒MER-131-210U3C相机
  17. 微信小程序-文字跑马灯
  18. rand、randn和randi的区别
  19. 使用vscode开发,使用插件记录
  20. Error response from daemon: Container 2c6d35b44a9862c63a6caf11a5622a33fe27979e12e51f9bd96f8dad98521c

热门文章

  1. 模拟usb重新插拔_Android 10带来黑科技 检测手机USB接口是否有液体或者是否过热...
  2. mysql datetime转换为date_MySQL date,datetime,timestamp区别及相互转换
  3. 2019成考计算机几时出成绩,2019年成人高考成绩什么时候出来?如何查询
  4. 网络服务-RSYNC
  5. C语言考研复试知识点整理
  6. git钩子放服务器_服务器git钩子
  7. 三相滤波器怎么接线_您知道家用电表如何接线吗?小编来告诉你!
  8. access两字段同时升序排序_7 天时间,我整理并实现了这 9 种常见的排序算法
  9. origin图上显示数据标签_【数据绘图】好图分享:寒假?不存在的!
  10. qt ui界面无法移动控件_使用qt 键盘上的方向键只能控制ui界面上的按钮选择,不能实现我设定的功能...