MySQL 初探递归查询

为什么需要这玩意?

Q: 那递归查询相比一般的查询有什么不同呢?

A: 可以查树形结构(自引用),比如一部门中还有一个子部门,如果要查这个部门中所有的部门,传统查询比较难搞。

要MySQL 8.0 +

先上语法:

SQL 复制代码
WITH RECURSIVE cte_name AS
(
    SELECT ...      -- return initial row set
    UNION ALL / UNION DISTINCT
    SELECT ...      -- return additional row sets
)
SELECT * FROM cte;

递归采用CTE(Common Table Expressions,With XXX 就是CTE)实现,再详细地解释下:

组成部分解释:

  1. WITH RECURSIVE:标识这是一个递归的Common Table Expression。

  2. cte_name:为递归查询定义一个临时的名称,用于在后续查询中引用。

  3. (column_list) :列出在递归过程中需要的列名。

  4. 初始化部分(非递归基)

    • SELECT column_list: 选择开始递归时的基本数据,这些通常是层级结构的顶层节点。
    • FROM table: 指定数据来源表。
    • WHERE initial_conditions: 设置初始条件,筛选出递归起点的数据。
  5. UNION ALL:将初始化部分的结果与递归部分的结果合并。

  6. 递归部分(递归步骤)

    • SELECT column_list: 选择在递归过程中需要的列,可能包括从CTE自身引用的列。
    • FROM cte_name: 引用前面定义的CTE名称,表示递归地基于之前计算出的结果继续查询。
    • JOIN table ON recursion_conditions: 使用JOIN操作将CTE与原始表或其他相关表连接起来,根据递归条件确定下一层级的数据。
  7. 最后的SELECT * FROM cte_name:从构建好的递归CTE中选择所有数据作为最终查询结果。

举个例子

上图是departments表,能看出,parent_department_id就是一个自引用字段,引的是ID。 我们的SQL语句如下:

sql 复制代码
WITH RECURSIVE departments_list as
(
SELECT departments.id,departments.department_name,departments.parent_department_id from departments WHERE id = 1
UNION ALL
SELECT d1.id,d1.department_name,d1.parent_department_id from departments d1 inner join departments_list d2 on d1.parent_department_id = d2.id
)
SELECT * FROM departments_list;

我写下来,我感觉要注意的几个问题一定要搞明白:

  1. Q:就是departments_list的字段是怎么确定的? A:是第一个子SQL的Select字段决定的。
  2. Q:怎么才算结束?A:第二个子SQL查不到值了。

参考文档:

教你如何使用 MySQL8 递归 - Java开发指北 - SegmentFault 思否

相关推荐
星辰离彬11 小时前
Java 与 MySQL 性能优化:Java应用中MySQL慢SQL诊断与优化实战
java·后端·sql·mysql·性能优化
程序猿小D13 小时前
[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的个人财务管理系统,推荐!
java·数据库·mysql·spring·毕业论文·ssm框架·个人财务管理系统
zhuiQiuMX13 小时前
脉脉maimai面试死亡日记
数据仓库·sql·面试
发仔12318 小时前
Oracle与MySQL核心差异对比
mysql·oracle
GEEK零零七19 小时前
Leetcode 1070. 产品销售分析 III
sql·算法·leetcode
叁沐20 小时前
MySQL 08 详解read view:事务到底是隔离的还是不隔离的?
mysql
wkj00120 小时前
navicate如何设置数据库引擎
数据库·mysql
ladymorgana20 小时前
【Spring Boot】HikariCP 连接池 YAML 配置详解
spring boot·后端·mysql·连接池·hikaricp
御控工业物联网21 小时前
御控网关如何实现MQTT、MODBUS、OPCUA、SQL、HTTP之间协议转换
数据库·sql·http
Code季风1 天前
SQL关键字快速入门:CASE 实现条件逻辑
javascript·数据库·sql