mysql递归查询语法WITH RECURSIVE的使用

2025-05-09 14:50

本文主要是介绍mysql递归查询语法WITH RECURSIVE的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《mysql递归查询语法WITHRECURSIVE的使用》本文主要介绍了mysql递归查询语法WITHRECURSIVE的使用,WITHRECURSIVE用于执行递归查询,特别适合处理层级结构或递归...

WITH RECURSIVE 是 SQL 中用于执行递归查询的语法,特别适合于处理层级结构或递归数据(如http://www.chinasem.cn树形结构、图结构)。递归查询可以反复引用自己来查询多层次的数据,而无需写多个嵌套查询。

基本语法结构:

WITH RECURSIVE CTE_name AS (
    -- 基础查询部分 (非递归部分)
    SELECT column1, column2, ...
    FROM table_name
    WHERE condition

    UNION ALL

    -- 递归查询部分
    SELECT column1, column2, ...
    FROM table_name t
    JOIN CTE_name cte ON t.column = cte.column
    WHERE condition
)
SELECT * FROM CTE_name;

关键部分解析:

  • WITH RECURSIVE

    • WITH 用于创建公共表表达式(CTE),RECURSIVE 关键字标识这是一个递归查询。
    • CTE_name 是你为公共表表达式(CTE)起的名字,后续查询可以引用它。
  • 基础查询(非递归部分):

    • 这是递归查询的起点,用于查询层级结构中的根数据(通常是最上层或最初始的数据)。
    • 通常,这部www.chinasem.cn分查询会返回一个起始集合或基础条件,如树形结构中的根节点。
  • 递归查询部分:

    • 递归查询部分通常会参考(引用)上面基础查询的结果,形成一个不断迭代的过程。
    • 在递归查询部分中,常常会使用 JOIN 或者自连接来与 CTE_name(即递归查询的结果集)进行连接,查找下级数据。
    • 递归查询会逐步深入,直到没有更多的数据为止。
  • UNION ALL

    • UNION ALL 用于将基础查询(非递归部分)和递归查询部分合并成一个完整的结果集。
    • UNION ALL 不会去重(不同于 UNION),通常用于递归查询,以保持所有结果。
  • 最终查询:

    • 查询 CTE_name,得到递归查询的最终结果。
    • 递归查询的结果会返回所有层次的数据,直到没有更多的层级为止。

递归查询的工作流程:

  • 第一次迭代:

    • 执行基础查询部分,返回初始的数据集(通常是最顶层的数据)。
  • 第二次及后续迭代:

    • 递归查询部分会基于前一次查询的结果继续进行,查找下一级的数据(比如查找所有根节点的子节点)。
    • 每一轮迭代都会向结果集中添加新的行。
  • 停止条件:

    • 当递归查询找不到更多符合条件的行时,递归查询停止,返回最终的结果。

示例:员工与经理的层级关系

假设有一个员工表,每个员工有一个 manager_id 字段指向他们的经理,我们希望查询某个员工及其所有上级经理,直到最顶层的经理为止。

WITH RECURSIVE EmployeeHierarchy AS (
    -- 基础查询部分:查找某个特定员工
    SELECT id, name, manager_id
    FROM employees
    WHERE id = :employee_id  -- 查找指定员工

    UNION ALL

    -- 递归查询部分:查找员工的经理
    SELECT e.id, e.name, e.manager_id
    FROM employees e
    JOIN EmployeeHierarchy eh ON e.id = eh.manager_id
)
-- 返回所有员工及其上级经理
SELECT * FROM EmployeeHierarchy;

解释:

  • 基础查询部分:

    • 查找特定员工(通过 id = :employee_id)。
  • 递归查询部分:

    • 通过自连接 JOIN EmployeeHierarchy eh ON e.id = eh.manager_id 查找该员工的经理(manager_id 字段指向的员工)。
  • UNION ALL

    • 合并基础查询部分(初始员工)和递归查询部分(逐级向上查找经理)。
  • 查询最终结果:

    • 返回递归查询的结果,即该员工及其所有上级经理。

示例:树形结构的数据(如分类)

假设有一个包含分类的表 categories,每个分类有一个 parent_id 字段指向其父分类。我们希望查询某个分类及其所有的子分类。

WITH RECURSIVE CategoryHierarchy AS (
    -- 基础查询部分:查找某个特定分类
    SELECT id, name, parent_id
    FROM categories
    WHERE id = :category_id  -- 查找指定分类

    Uwww.chinasem.cnNION ALL

    -- 递归查询部分:查找分类的子分类
    SELECT c.id, c.name, c.parent_id
    FROM categories c
    JOIN CategoryHierarchy ch ON c.parent_id = ch.id
)
-- 返回所有分类及其子分类
SELECT * FROM CategoryHierarchy;

解释:

  • 基础查询部分:

    • 查找指定的分类(通过 id = :category_id)。
  • 递归查询部分:

    • 查找所有子分类,Jhttp://www.chinasem.cnOIN 操作android通过 c.parent_id = ch.id 来连接父分类和子分类。
  • UNION ALL

    • 合并基础查询和递归查询部分,逐层查找所有子分类。

递归查询的特性:

  • 递归深度限制:

    • 大多数数据库系统(如 PostgreSQLmysql 等)会对递归查询的深度进行限制,防止无限递归。MySQL 默认为 1000 层深度,但可以通过配置来调整此值。
  • 性能问题:

    • 递归查询可能会消耗较多的资源,特别是当层级较多或数据量庞大时。需要小心使用,避免导致性能瓶颈。
  • 迭代过程:

    • 递归查询通过每一轮的迭代逐步向下查询,直到没有更多数据。每一轮迭代的结果都会在下次查询中被引用。

总结:

  • WITH RECURSIVE 适用于处理层级结构或递归关系的数据,允许在查询中反复引用自己,查找多层次的数据。
  • 它由基础查询(非递归部分)和递归查询部分组成,通过 UNION ALL 连接两部分,逐步展开结果。
  • 使用递归查询时,需要注意递归深度限制和性能影响。

到此这篇关于mysql递归查询语法WITH RECURSIVE的使用 的文章就介绍到这了,更多相关mysql WITH RECURSIVE内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)! 

这篇关于mysql递归查询语法WITH RECURSIVE的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154545

相关文章

MySQL 主从复制部署及验证(示例详解)

《MySQL主从复制部署及验证(示例详解)》本文介绍MySQL主从复制部署步骤及学校管理数据库创建脚本,包含表结构设计、示例数据插入和查询语句,用于验证主从同步功能,感兴趣的朋友一起看看吧... 目录mysql 主从复制部署指南部署步骤1.环境准备2. 主服务器配置3. 创建复制用户4. 获取主服务器状态5

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

MySQL 迁移至 Doris 最佳实践方案(最新整理)

《MySQL迁移至Doris最佳实践方案(最新整理)》本文将深入剖析三种经过实践验证的MySQL迁移至Doris的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于CDC(ChangeData... 目录一、China编程JDBC Catalog 联邦查询方案(适合跨库实时查询)1. 方案概述2. 环境要求3.

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme