Mysql8.0递归查询的简单用法示例

yizhihongxing

下面我将为大家详细介绍Mysql8.0递归查询的简单用法及示例。

什么是递归查询

递归查询是指在数据库中通过自身关联取得本身所需要的数据。通常我们会使用递归查询来查询有层级关系的数据,例如:树状结构等。

Mysql8.0递归查询的简单用法

在Mysql8.0之后,Mysql新增了WITH RECURSIVE关键字,可以很方便地进行递归查询。使用方式如下:

WITH RECURSIVE 递归查询语句

其中,“递归查询语句”指的是需要进行递归查询的SQL语句,WITH RECURSIVE关键字则是告诉Mysql这是一条递归查询语句。

示例1:查询树状结构的子级节点

我们假设有一个表示部门关系的表dept,其表结构及数据如下:

CREATE TABLE dept (
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(100) DEFAULT NULL,
  parent_id int(11) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

INSERT INTO dept (name,parent_id) VALUES ('总部',0),('财务部',1),('人事部',1),('市场部',1),('技术部',1),('人力资源部',3),('招聘部',3),('社保部',6),('公积金部',6);

我们现在需要查询出‘人事部’下面的所有部门,包括其子部门,可以使用如下递归查询语句:

WITH RECURSIVE cte (id,name,parent_id) AS (
  SELECT id,name,parent_id FROM dept WHERE name = '人事部' 
  UNION ALL
  SELECT d.id,d.name,d.parent_id FROM dept d JOIN cte ON d.parent_id = cte.id
)
SELECT * FROM cte;

我们在递归查询语句中定义了一个cte(Common Table Expression)公共表达式,并在其中设置了初始值为查询‘人事部’,接着我们在下方使用UNION ALL关键字加入子集查询,查询条件为子集的parent_id等于父集的id。

最后我们查询cte公共表达式即可获取到查询结果,查询结果如下:

+----+--------+-----------+
| id |  name  | parent_id |
+----+--------+-----------+
|  3 | 人事部 |         1 |
|  6 | 人力资源部 |       3 |
|  7 | 招聘部 |         6 |
+----+--------+-----------+

示例2:查询树状结构的所有父级节点

接下来我们再来看一个查询树状结构的所有父级节点的递归查询语句。假设我们有一个存储组织机构的表org,其表结构及数据如下:

CREATE TABLE org (
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(100) DEFAULT NULL,
  parent_id int(11) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

INSERT INTO org (name,parent_id) VALUES 
  ('A',0),('B',1),('C',2),('D',3),('E',4),
  ('F',0),('G',6),('H',7),('I',8),('J',9);

我们现在需要查询出‘E’所在的所有父级节点,可以使用如下递归查询语句:

WITH RECURSIVE cte AS (
  SELECT id,name,parent_id FROM org WHERE name = 'E'
  UNION ALL
  SELECT d.id,d.name,d.parent_id FROM org d JOIN cte ON d.id = cte.parent_id
)
SELECT * FROM cte;

我们同样在递归查询语句中定义了一个cte公共表达式,设置了初始值为查询E所在的部门,再通过UNION ALL关键字进行子集查询,查询条件为我们在公共表达式中查询到的parent_id等于当前查询结果的id。

最后我们查询cte公共表达式即可获取到查询结果,查询结果如下:

+----+------+------+-----------+
| id | name | parent_id | 
+----+------+------+-----------+
|  5 |  E   |         4 |
|  4 |  D   |         3 |
|  2 |  C   |         1 |
|  1 |  B   |         0 |
+----+------+------+-----------+

至此,Mysql8.0递归查询的简单用法及两个示例就介绍完毕了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mysql8.0递归查询的简单用法示例 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Java实现递归计算n的阶乘

    让我们来详细讲解一下Java实现递归计算n的阶乘的完整攻略。 什么是阶乘 “阶乘”是指对于一个正整数n,它的阶乘就是1到n所有正整数相乘的积。例如5的阶乘为1 * 2 * 3 * 4 * 5 = 120。 递归算法 递归算法是一种解决问题的方法,它将一个问题分成一些子问题然后递归地解决它们。这些子问题的解将被合并为原始问题的解。对于计算阶乘来说,递归算法非常…

    other 2023年6月27日
    00
  • js字符串格式化~欢迎来搂~~

    JS字符串格式化~欢迎来搂~~ 在编写JS代码时,处理字符串是一个非常常见的操作。格式化字符串在这些操作中尤其常见。例如,我们可能需要为一个字符串添加一些占位符,然后根据需要将它们替换为具体的值。JS中有几种方法可以实现字符串格式化。 基本方法:字符串拼接 其中最简单的方法可能就是字符串拼接了。例如: let name = ‘World’; let mess…

    其他 2023年3月29日
    00
  • 最终幻想15开发版弹出应用程序错误怎么办?

    当开发者在使用最终幻想15的时候遇到了应用程序错误,可以采取以下攻略: 1. 重新安装游戏 有时候最终幻想15的开发版本会出现应用程序错误的情况,可能是因为安装过程中出现了问题。这时可以尝试重新安装游戏来解决这个问题。 首先,需要卸载原来的游戏,然后从官方网站或其他安全可靠的来源重新下载游戏的安装包进行安装。务必保证下载的安装包来源正规、文件完整,安装前最好…

    other 2023年6月25日
    00
  • 解决springjpa的局部更新字段问题

    下面我来详细讲解“解决springjpa的局部更新字段问题”的完整攻略。 1. 问题描述 在使用springjpa进行数据库操作的时候,有时会遇到要更新某个实体类的部分字段,而不是全部字段。但是springjpa默认的update操作只能更新整个实体类的所有字段,无法实现局部更新。 2. 解决方案 解决这个问题的方案有两种: 2.1 使用@Query注解 可…

    other 2023年6月25日
    00
  • 7z命令行详解

    以下是“7z命令行详解的完整攻略”的详细讲解,过程中包含两个示例说明的标准Markdown格式文本: 7z命令行详解的完整攻略 7z是一款开源的压缩软件,支持多种压缩格式。本文将介绍如何使用7z命令行进行压缩和解压缩操作,并提供一些常用的命令示例。 1. 压缩文件 1.1 压缩单个文件 我们可以使用以下命令将单个文件压为7z格式: 7z a -t7z fil…

    other 2023年5月10日
    00
  • premiere视频怎么嵌套素材? premiere视频嵌套的技巧

    Premiere视频嵌套素材攻略 在Adobe Premiere Pro中,嵌套素材是一种将多个视频、音频或图像合并为一个单独的嵌套序列的技术。这种方法可以帮助你更好地组织和管理复杂的项目,并提供更多的编辑选项。下面是一个详细的攻略,教你如何在Premiere中嵌套素材。 步骤1:创建嵌套序列 在Premiere的项目面板中,右键单击要嵌套的素材,并选择\”…

    other 2023年7月27日
    00
  • MFC列表控件CListCtrl使用方法示范

    下面我将详细讲解MFC列表控件CListCtrl的使用方法示范。 1. 创建CListCtrl控件 要使用CListCtrl控件,首先需要在对应的对话框或视图中添加该控件。可以通过如下步骤进行操作: 在资源视图中找到需要添加控件的对话框或视图。 右键单击该对话框或视图,并选择“添加类”。 在弹出的“添加类”对话框中选择“MFC Class from the …

    other 2023年6月26日
    00
  • c#截取字符串某个字符之后的字符

    当然,我很乐意为您提供有关“C#截取字符串某个字符之后的字符”的完整攻略。以下是详细的步骤和两个示例: 1 C#截取字符串某个字符之后的字符 在C#应用程序中,有时需要截取字符串某个字符之后的字符。以下是截取字符串某个字符之后的字符的方法: 1.1 使用Substring方法 您可以使用C#的Substring方法截取字符串某个字符之后的字符。以下是使用Su…

    other 2023年5月6日
    00
合作推广
合作推广
分享本页
返回顶部