教你如何使用MySQL8递归的方法
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,之前写过一篇 MySQL通过自定义函数的方式,递归查询树结构,从MySQL 8.0 开始终于支持了递归查询的语法CTE首先了解一下什么是 CTE,全名 Common Table Expressions
千家信息网最后更新 2026年11月03日教你如何使用MySQL8递归的方法
之前写过一篇 MySQL通过自定义函数的方式,递归查询树结构,从MySQL 8.0 开始终于支持了递归查询的语法
CTE
首先了解一下什么是 CTE,全名 Common Table Expressions
WITH cte1 AS (SELECT a, b FROM table1), cte2 AS (SELECT c, d FROM table2)SELECT b, d FROM cte1 JOIN cte2WHERE cte1.a = cte2.c;
cte1, cte2 为我们定义的CTE,可以在当前查询中引用
可以看出 CTE 就是一个临时结果集,和派生表类似,二者的区别这里不细说,可以参考下MySQL开发文档:https://dev.mysql.com/doc/refman/8.0/en/with.html#common-table-expressions-recursive-examples
递归查询
先来看下递归查询的语法
WITH RECURSIVE cte_name AS( SELECT ... -- return initial row set UNION ALL / UNION DISTINCT SELECT ... -- return additional row sets)SELECT * FROM cte;
- 定义一个CTE,这个CTE 最终的结果集就是我们想要的 "递归得到的树结构",RECURSIVE 代表当前 CTE 是递归的
- 第一个SELECT 为 "初始结果集"
- 第二个SELECT 为递归部分,利用 "初始结果集/上一次递归返回的结果集" 进行查询得到 "新的结果集"
- 直到递归部分结果集返回为null,查询结束
- 最终UNION ALL 会将上述步骤中的所有结果集合并(UNION DISTINCT 会进行去重),再通过 SELECT * FROM cte; 拿到所有的结果集
递归部分不能包括:
- 聚合函数例如 SUM()
- GROUP BY
- ORDER BY
- LIMIT
- DISTINCT
上面的讲解可能有点抽象,通过例子慢慢来理解
WITH RECURSIVE cte (n) AS -- 这里定义的n相当于结果集的列名,也可在下面查询中定义( SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 5)SELECT * FROM cte;-- result+------+| n |+------+| 1 || 2 || 3 || 4 || 5 |+------+
- 初始结果集为 n =1
- 这时候看递归部分,第一次执行 CTE结果集即是 n =1,条件发现并不满足 n < 5,返回 n + 1
- 第二次执行递归部分,CTE结果集为 n = 2,递归... 直至条件不满足
- 最后合并结果集
EXAMPLE
最后来看一个树结构的例子
CREATE TABLE `c_tree` ( `id` int(11) NOT NULL AUTO_INCREMENT, `cname` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `parent_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
mysql> select * from c_tree;+----+---------+-----------+| id | cname | parent_id |+----+---------+-----------+| 1 | 1 | 0 || 2 | 2 | 0 || 3 | 3 | 0 || 4 | 1-1 | 1 || 5 | 1-2 | 1 || 6 | 2-1 | 2 || 7 | 2-2 | 2 || 8 | 3-1 | 3 || 9 | 3-1-1 | 8 || 10 | 3-1-2 | 8 || 11 | 3-1-1-1 | 9 || 12 | 3-2 | 3 |+----+---------+-----------+
mysql> WITH RECURSIVE tree_cte as( select * from c_tree where parent_id = 3 UNION ALL select t.* from c_tree t inner join tree_cte tcte on t.parent_id = tcte.id)SELECT * FROM tree_cte;+----+---------+-----------+| id | cname | parent_id |+----+---------+-----------+| 8 | 3-1 | 3 || 12 | 3-2 | 3 || 9 | 3-1-1 | 8 || 10 | 3-1-2 | 8 || 11 | 3-1-1-1 | 9 |+----+---------+-----------+
- 初始结果集R0 = select * from c_tree where parent_id = 3
- 递归部分,第一次 R0 与 c_tree inner join 得到 R1
- R1 再与 c_tree inner join 得到 R2
- ...
- 合并所有结果集 R0 + ... + Ri
更多信息
https://dev.mysql.com/doc/refman/8.0/en/with.html
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
结果
递归
查询
部分
就是
结构
例子
函数
条件
第一次
语法
支持
代表
信息
全名
内容
慢慢来
文档
方式
更多
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网黑科技
广州为想互联网科技有限公司
没上市的科技互联网公司
上海互联网科技有限公司
互联网医疗科技
时间互联网络科技
菲比寻常互联网科技
顺玮阁互联网科技
狮子座互联网科技培训
甘肃拓世互联网科技有限公司
互联网科技产品
成都互联网科技公司100强
互联网金融科技公司干啥的
互联网科技与管理
青岛科技大学互联网大赛研究生
速维有品互联网信息科技(苏州)有限公司
消费医药和互联网科技
世界互联网科技成果奖
绵阳真晨互联网科技有限公司
互联网科技创新方面的资料
互联网科技企业
互联网为科技
互联网科技卖菜
互联网科技的
科技服务与互联网
互联网科技小贷
互联网科技作文
互联网科技论坛
互联网媒体平台算高科技产业
第三届互联网大会安防黑科技