在本教程中,您将了解MySQL递归CTE(公共表表达式)以及如何使用它来遍历分层数据。
自MySQL 8.0版以来简要介绍了公共表表达式或叫CTE的功能,因此需要您在计算机上安装MySQL 8.0,以便在本教程中练习本语句。

1. MySQL递归CTE简介

递归公用表表达式(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 ALL或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