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日

相关文章

  • jQuery实现经典的网页3D轮播图封装功能【附源码下载】

    首先需要说明的是,该攻略是通过jQuery实现经典的网页3D轮播图的封装,可以帮助网站开发者快速地在自己的网站上添加一个3D轮播图,提升用户的体验效果。下面是该攻略的详细步骤: 1. 引入需要的文件 要实现该3D轮播图效果,必须引入以下文件: <!– jquery文件 –> <script src="https://cdn.b…

    other 2023年6月25日
    00
  • JavaScript ES6中class定义类实例方法

    JavaScript ES6中class定义类实例方法的完整攻略 在JavaScript ES6中,可以使用class关键字来定义类,并使用实例方法来定义类的行为。以下是详细的攻略: 1. 定义类 使用class关键字来定义一个类,并使用constructor方法来定义类的构造函数。 示例代码: class Person { constructor(name…

    other 2023年10月15日
    00
  • nodejs之process进程

    Node.js 之 Process 进程 在 Node.js 中,Process 是一个全局对象,用于管理当前 Node.js 进程。本文将介绍 Node.js 之 Process 进程,包括基本概念、应用场景、实现方法和示例说明。 基本概念 在 Node.js 中,Process 是一个全局对象,用于管理当前 Node.js 进程。Process 对象提供…

    other 2023年5月6日
    00
  • Java多线程——Semaphore信号灯

    Java多线程——Semaphore信号灯 在Java多线程编程中,信号灯(Semaphore)是一个非常重要的概念。信号灯控制着多个线程的访问顺序,保证线程间的同步和协作。本文将介绍Semaphore的基本用法,以及如何在Java多线程编程中使用它。 Semaphore的概念 Semaphore是一个信号灯,使用计数器来实现线程间的同步。Semaphore…

    其他 2023年3月28日
    00
  • Linux内存文件系统tmpfs(/dev/shm)详细介绍

    下面是Linux内存文件系统tmpfs(/dev/shm)的详细介绍: 1. 概述 /tmp目录和/dev/shm目录都是用于存储临时文件的目录,但是它们的实现原理不同。其中/tmp目录是基于磁盘的,而/dev/shm目录是基于内存的,它是tmpfs文件系统的一个挂载点。 tmpfs是一种内存文件系统,其实现方式类似于虚拟内存,可以将内存中的空间用作虚拟磁盘…

    other 2023年6月27日
    00
  • 如何在开机或重启之后自动启动该文件或应用程序?

    要在开机或重启之后自动启动文件或应用程序,可以通过以下几个步骤实现: 在操作系统的启动目录中创建一个快捷方式或者脚本文件,该文件可以是.bat、.exe、.py等可执行文件。 在启动目录中创建快捷方式的方法因操作系统而异,下面分别介绍Windows和Linux系统的创建方法: 在Windows系统中,启动目录通常位于”C:\ProgramData\Micro…

    other 2023年6月27日
    00
  • 利用 JavaScript 构建命令行应用

    构建命令行应用是 JavaScript 开发中的一项非常实用技能。这种应用程序在终端或命令行界面上运行,可以使用户使用命令完成不同的任务。 下面是关于如何利用 JavaScript 构建命令行应用的完整攻略: 1. 准备工作 在开始构建命令行应用程序之前,需要按照以下步骤进行准备工作: 安装 Node.js 和 npm:Node.js 是一种基于 JavaS…

    other 2023年6月26日
    00
  • Android 获取判断是否有悬浮窗权限的方法

    Android 获取判断是否有悬浮窗权限的方法 在Android开发中,判断是否有悬浮窗权限是一个常见的需求。下面是一种获取并判断悬浮窗权限的方法: 首先,在AndroidManifest.xml文件中添加悬浮窗权限声明: <uses-permission android:name=\"android.permission.SYSTEM_AL…

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