MySQL 命令之 WITH Recursive 递归查询
with(Common Table Expressions/CTE) 在 MySQL 中被称为公共表达式,可以作为一个临时表然后在其他结构中调用.如果是自身调用那么就是后面讲的递归.
理论原理
MySQL with Recursive是什么?
MySQL with Recursive是一种基于递归思想的 MySQL 查询方式,可以实现对数据的递归查询和处理,返回符合条件的数据。在MySQL 8.0版本中,该功能被正式引入。
MySQL with Recursive有什么作用?
MySQL with Recursive的作用是基于一组初始数据,进行递归查询,返回符合条件的数据集。这种递归查询方式可以应用在很多场景下,比如对于树形结构、层级结构的数据处理,以及对数据进行分类汇总等。
MySQL with Recursive的使用限制?
MySQL with Recursive的使用限制主要在于查询语句的复杂性和效率。递归查询的复杂度随着层数的增加而增加,如果递归层数过多可能会导致查询效率低下甚至出现死循环的情况。因此,在使用MySQL with Recursive时需要注意数据量大小和递归层数。
语法
1 |
|
WITH RECURSIVE
:表示要使用递归查询的方式处理数据。cte_name
:给这个临时的递归表取个名字,可以在初始查询和递归查询中引用。column_list
:表示cte_name
查询表中包含的列名,列名之间用逗号分隔。initial_query_result
: 表示初始的查询结果,应该与column_list
中的列名对应。UNION
:表示将两个查询结果集进行联合,使用UNION ALL则表示保留重复数据。recursive_query
:表示递归查询语句,应当与column_list
中的列名对应。condition
:表示递归查询的终止条件,需要使用cte_name
中的列进行判断。SELECT * FROM cte_name
: 表示最终返回的查询结果集,可以通过cte_name
查询表中的列名进行指定。
简单例子
1 |
|
运行结果
1 |
|
用 Python 实现就是
1 |
|
具体实例:(高级使用)
准备工作:
首先准备一张递归表:这里使用用户邀请记录表,A可以邀请B,B可以邀请C,C可以……依次随意邀请。
1 |
|
准备一张用户表 比如
1 |
|
造数据
1 |
|
造出来一份这样结构的关系:
S邀请了A,A邀请了B、C,B邀请了D、E,D邀请了H、I,E邀请了J
问题一(类似向上递归)
比如现在查询 J109 的所有上级,并且还要查出,这些上级和 J109 的关系是几级
1 |
|
查询结果:
1 |
|
刨析SQL
1 |
|
问题二(类似向下递归)
如果再加一张消费记录表,每个人在平台的消费都会给记录到消费记录表中,比如A,A下面有B、C,A邀请的第一级有几个人,就算几个分支,现在需要查询出A下面有多少个分支,并且,每个分支的消费额(比如B分支,包含B和B的所有子节点)有多少。
准备数据:给刚才的A-I,没人插入一条1w的购物记录
1 |
|
解决:拿A100举例,他下面俩链路,B和C,分别对应6w和3w
1 |
|
查询结果:
1 |
|
注意事项
递归的层数应该尽可能的少,过多的递归层数可能导致查询效率低下或者程序崩溃。
MySQL with Recursive功能在MySQL 8.0版本中才被正式引入,使用该功能建议使用该版本或者以上版本。
使用时需要考虑数据量的大小,如果数据量过大可能会影响递归查询的效率。
总结
MySQL with Recursive是一种基于递归思想的MySQL查询方式,可以实现对数据的递归查询和处理,应用广泛。在使用时需要注意递归的层数和数据量大小等因素。通过学习本文,相信大家已经对MySQL with Recursive有了深入的理解,并能够熟练运用该功能。