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

下面我将为大家详细介绍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日

相关文章

  • pyecharts安装及使用指南(最新)

    Pyecharts安装及使用指南 什么是Pyecharts? Pyecharts是一个基于Echarts3的Python可视化库,支持多种图表库,包括基础图表、地图、3D图表等,具有简单易用、功能强大等特点。 安装Pyecharts 使用pip命令可以很方便地安装Pyecharts: pip install pyecharts 如果您需要安装某些已经废弃的引…

    其他 2023年3月28日
    00
  • linux编译

    以下是Linux编译的完整攻略,包括两个示例说明。 1. Linux编译 在Linux中,编译源代码通常需要使用GNU编译器集合(GCC)和make工具。编译的过程通常包括以下步骤: 下载源代码: wget http://example.com/source.tar.gz 解压源代码: tar -zxvf source.tar.gz 进入源代码目录: cd …

    other 2023年5月9日
    00
  • 后缀名为.td的是什么文件td文件用什么打开?

    后缀名为.td的文件是通常用于存储表格数据的文件,它是Tableau软件的一种数据文件格式。Tableau是一款用于数据可视化和分析的强大工具,可以帮助用户将数据转化为易于理解和交互的图表和报表。 要打开.td文件,您需要安装Tableau软件,并按照以下步骤进行操作: 下载和安装Tableau软件:您可以从Tableau官方网站(https://www.t…

    other 2023年8月5日
    00
  • js常用工具

    JavaScript是一种广泛使用的编程语言,用于开发Web应用程序和其他类型的应用程序。在JavaScript开发中,有许多常用的工具和库,可以帮助开发人员更轻松地完成任务。以下是一个完整攻略,介绍了JavaScript中常用的工具和库。 步骤1:使用jQuery库 jQuery是一种流行的JavaScript库,用于简化DOM操作事件处理、AJAX请求等…

    other 2023年5月6日
    00
  • Opencv+Python实现缺陷检测

    Opencv+Python实现缺陷检测 Opencv是一个开源的计算机视觉库,提供了许多常用的图像处理函数和算法。Python是一种高级编程语言,能够轻松地使用Opencv进行图像处理和分析。本文将介绍使用Opencv和Python实现缺陷检测的方法。 缺陷检测的原理 缺陷检测是指识别和定位在图像中的缺陷部分。缺陷可以是任何形式的,例如裂纹、凸起、凹陷等等。…

    其他 2023年3月28日
    00
  • 怎么删除电脑C盘里根目录中的bootsqm.dat文件?

    删除电脑C盘里根目录中的bootsqm.dat文件,可以按照以下步骤进行: 步骤一:打开文件资源管理器 使用快捷键 Win+E 或在开始菜单中选择“文件资源管理器”,打开Windows文件资源管理器。 步骤二:定位文件路径 在文件资源管理器中,定位到电脑C盘的根目录。根目录指C盘中不包括任何文件夹的目录,即C盘中最顶层的文件夹。 步骤三:显示隐藏文件 boo…

    other 2023年6月27日
    00
  • 专业级的MySQL开发设计规范及SQL编写规范

    MySQL是目前最流行的关系型数据库之一,适用于各种复杂应用程序的构建,但是在实际使用中如何规范MySQL的开发设计和SQL编写就成为了非常重要的问题。以下是针对这一问题的专业级攻略: 1. 数据库设计规范 在进行数据模型设计时,应当符合下列最佳实践: 1.1 概念模型转化为物理模型的顺序 通常应该首先设计概念模型,并对其进行修正和扩展,之后再转化为物理模型…

    other 2023年6月25日
    00
  • Shell中的单中括号和双中括号的用法详解

    下面是 “Shell中的单中括号和双中括号的用法详解”的完整攻略。 单中括号和双中括号的基本区别 单中括号 [ ] 和双中括号 [[ ]] 在 Shell 中都是用于条件测试的,但两者有一些差别。下表列出了两者的差别: 特性 单中括号 [ ] 双中括号 [[ ]] 逻辑判断 使用标准的条件测试;无法进行高级判断;不支持&&或||运算符。 拥有…

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