首页
学习
活动
专区
圈层
工具
发布

mysql 如何写递归sql

MySQL中的递归SQL通常用于处理具有层次结构的数据,例如组织结构、文件系统等。MySQL 8.0及以上版本支持递归公共表表达式(Recursive Common Table Expressions, CTE),可以方便地编写递归查询。

基础概念

递归CTE允许在一个查询中引用自身,从而实现递归查询。递归CTE由两部分组成:

  1. 非递归部分:这是递归的起点,通常包含初始条件。
  2. 递归部分:这是递归的核心,包含递归调用。

优势

  • 简洁性:递归CTE使得复杂的递归查询更加简洁易读。
  • 性能:相对于存储过程或自定义函数,递归CTE通常具有更好的性能。

类型

  • 直接递归:递归调用自身。
  • 间接递归:通过中间表或视图进行递归调用。

应用场景

  • 组织结构查询:查询某个员工的所有下属。
  • 文件系统查询:查询某个目录下的所有文件和子目录。
  • 树形结构查询:查询树形结构中的所有节点。

示例代码

假设有一个员工表 employees,结构如下:

代码语言:txt
复制
CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    manager_id INT
);

插入一些示例数据:

代码语言:txt
复制
INSERT INTO employees (id, name, manager_id) VALUES
(1, 'Alice', NULL),
(2, 'Bob', 1),
(3, 'Charlie', 1),
(4, 'David', 2),
(5, 'Eve', 2);

查询某个员工的所有下属:

代码语言:txt
复制
WITH RECURSIVE subordinates AS (
    -- 非递归部分
    SELECT id, name, manager_id
    FROM employees
    WHERE manager_id = 1
    UNION ALL
    -- 递归部分
    SELECT e.id, e.name, e.manager_id
    FROM employees e
    INNER JOIN subordinates s ON e.manager_id = s.id
)
SELECT * FROM subordinates;

参考链接

常见问题及解决方法

  1. 递归深度限制:MySQL默认的递归深度限制为100。如果需要处理更深的递归,可以通过设置 optimizer_switch 参数来增加限制:
  2. 递归深度限制:MySQL默认的递归深度限制为100。如果需要处理更深的递归,可以通过设置 optimizer_switch 参数来增加限制:
  3. 性能问题:递归查询可能会导致性能问题,特别是当数据量较大时。可以通过优化索引、减少递归深度等方式来提高性能。
  4. 无限递归:如果递归条件设置不当,可能会导致无限递归。确保递归终止条件正确,并在测试环境中验证递归逻辑。

通过以上方法,可以有效地处理MySQL中的递归SQL查询。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

算法回顾--如何写递归?

---- 递归书写方法 严格定义递归函数作用,包括参数,返回值,side effect 先一般再特殊 每次递归必须缩小问题规模 每次问题规模缩小程度必须为1 总之递归就是”装傻”的把原始的思路表现出来,...按照题目意图,递归函数为 f(n),其中n为要求出值的索引位置....func fibonacci(n int) int { } 先考虑一般情况,且每一次递归都要缩小规模,对于斐波那契数列其f(n) = f(n-1)+f(n-2),那么就可以写出下列函数 func fibonacci...(n int) int { return fibonacci(n-1) + fibonacci(n-2) } 在考虑特殊情况,一般特殊情况即递归的结束条件,对于斐波那契数列为第一位以及第二位为1,也就是...二路归并排序 归并排序是分治思想的体现,能分治解决的问题绝大多数可以递归解决,其实递归不断缩小问题规模本身也是分治思想. 那么先定义归并函数对一个数组排序.

1.1K20
  • mysql省市区递归查询_mysql 递归查询

    递归查询父节点 和子节点 包含mysql 递归查询父节点 和子节点 mysql递归查询,查父集合,查子集合 查子集合 –drop FUNCTION `getChildList` CREATE FUNCTION...`getChi … MySQL递归查询_函数语法检查_GROUP_CONCAT组合结果集的使用 1-前言: 在Mysql使用递归查询是很不方便的,不像Sqlserver...在My … MySQL递归查询树状表的子节点、父节点具体实现 mysql版本(5.5.6等等)尚未支持循环递归查询,和sqlserver.oracle相比,mysql难于在树状表中层层遍历的子节点.本程序重点参考了下面的资料...,写了两个sql存储过程,子节点查询算 … 递归的实际业务场景之MySQL 递归查询 喜欢就点个赞呗!...源码 MySQL递归查询 MySQL8.0已经支持CTE递归查询,举例说明 CREATE TABLE EMP (EMPNO integer NOT NULL, ENAME ), JOB ), MGR integer

    13.8K20

    优化SQL查询:如何写出高性能SQL语句

    2、 统一SQL语句的写法 对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的。...3、 不要把SQL语句写得太复杂 我经常看到,从数据库中捕捉到的一条SQL语句打印出来有2张A4纸这么长。一般来说这么复杂的语句通常都是有问题的。...8、 一些SQL查询语句应加上nolock 在SQL语句中加nolock是提高SQL Server并发性能的重要手段,在oracle中并不需要这样做,因为oracle的结构更为合理,有undo表空间保存...server2000的数据库,我们的程序在提交sql语句的时候,没有使用强类型提交这个字段的值,由sql server 2000自动转换数据类型,会导致传入的参数与主键字段类型不一致,这个时候sql...如果连接的字段上没有索引,那SQL2000的效率是相当低的,而SQL2005提供了Hash join,相当于临时给A,B表的结果集加上索引,因此SQL2005的效率比SQL2000有很大提高,我认为,这是一个重要的原因

    2.2K30

    优化SQL查询:如何写出高性能SQL语句

    2、 统一SQL语句的写法 对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的。...3、 不要把SQL语句写得太复杂 我经常看到,从数据库中捕捉到的一条SQL语句打印出来有2张A4纸这么长。一般来说这么复杂的语句通常都是有问题的。...8、 一些SQL查询语句应加上nolock 在SQL语句中加nolock是提高SQL Server并发性能的重要手段,在oracle中并不需要这样做,因为oracle的结构更为合理,有undo表空间保存...server2000的数据库,我们的程序在提交sql语句的时候,没有使用强类型提交这个字段的值,由sql server 2000自动转换数据类型,会导致传入的参数与主键字段类型不一致,这个时候sql...如果连接的字段上没有索引,那SQL2000的效率是相当低的,而SQL2005提供了Hash join,相当于临时给A,B表的结果集加上索引,因此SQL2005的效率比SQL2000有很大提高,我认为,这是一个重要的原因

    3.9K80

    优化SQL查询:如何写出高性能SQL语句

    2、 统一SQL语句的写法 对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的。...3、 不要把SQL语句写得太复杂 我经常看到,从数据库中捕捉到的一条SQL语句打印出来有2张A4纸这么长。一般来说这么复杂的语句通常都是有问题的。...8、 一些SQL查询语句应加上nolock 在SQL语句中加nolock是提高SQL Server并发性能的重要手段,在oracle中并不需要这样做,因为oracle的结构更为合理,有undo表空间保存...server2000的数据库,我们的程序在提交sql语句的时候,没有使用强类型提交这个字段的值,由sql server 2000自动转换数据类型,会导致传入的参数与主键字段类型不一致,这个时候sql...如果连接的字段上没有索引,那SQL2000的效率是相当低的,而SQL2005提供了Hash join,相当于临时给A,B表的结果集加上索引,因此SQL2005的效率比SQL2000有很大提高,我认为,这是一个重要的原因

    2.5K10

    SQL中的递归查询

    递归查询原理 SQL Server中的递归查询是通过CTE(表表达式)来实现。...至少包含两个查询,第一个查询为定点成员,定点成员只是一个返回有效表的查询,用于递归的基础或定位点;第二个查询被称为递归成员,使该查询称为递归成员的是对CTE名称的递归引用是触发。...递归查询的终止条件 递归查询没有显式的递归终止条件,只有当第二个递归查询返回空结果集或是超出了递归次数的最大限制时才停止递归。是指递归次数上限的方法是使用MAXRECURION。...递归查询的优点 效率高,大量数据集下,速度比程序的查询快。 递归的常见形式 WITH CTE AS ( SELECT column1,column2......USE SQL_Road GO CREATE TABLE Company ( 部门ID INT, 父级ID INT, 部门名称 VARCHAR(10) ) INSERT

    6.3K11

    SQL高级知识:递归查询

    SQL刷题专栏 SQL145题系列 递归查询原理 SQL中的递归查询是通过CTE(表表达式)来实现。...至少包含两个查询: 第一个查询为定点成员,定点成员只是一个返回有效表的查询,用于递归的基础或定位点; 第二个查询被称为递归成员,使该查询称为递归成员的是对CTE名称的递归引用是触发。...递归查询的终止条件 递归查询没有显式的递归终止条件,只有当第二个递归查询返回空结果集或是超出了递归次数的最大限制时才停止递归。 递归查询的优点 效率高,大量数据集下,速度比程序的查询快。...递归的常见形式 WITH CTE AS ( SELECT column1,column2......USE SQL_Road GO CREATE TABLE Employee ( UserID INT, ManagerID INT, Name NVARCHAR(10) )

    1.1K10

    如何写好 5000 行的 SQL 代码

    上千行的 SQL 代码常见,且永不过时!...我们几个 SQL 老玩家经常自吹, SQL 是半衰期最长的编程语言。玩会它不用担心失业。 如何去阅读和拆解一个上千行的 SQL 存储过程,有四大步骤 :理解代码,分拆代码,改写代码和保存代码。...我们一遍过的 SQL 就免检了?这个时候才考验你 SQL 真实功底和编码素质。 再检查命名规则,变量申明,事务控制以及性能优化。你会发现还有很多事情要做。...写好SQL代码,素质当然远不止这些!...分享一个最近做的脑图,掌握了这些才可以说 SQL 编码入门了 摸着你的良心,看看这个图,有则改良,无则加勉 以上脑图是我阅读了《SQL Programming Style》后,加上平时编码总结而成

    1.2K30

    如何写好 5000 行的 SQL 代码

    上千行的 SQL 代码常见,且永不过时!...我们几个 SQL 老玩家经常自吹, SQL 是半衰期最长的编程语言。玩会它不用担心失业。...我之前写过如何去阅读和拆解一个上千行的 SQL 存储过程,详情可见以下两篇文章: 如何提高阅读 SQL 源代码的快感 如何写好上千行的 SQL 存储过程(附代码规范) 这两文中提到了四大步骤:理解代码,...如要参考这5000行的实战SQL代码,可以关注我的微信公众号【有关SQL】,回复【5000】便可下载。 但装和拆并不是一个逆反的过程!...我复盘过很多这样的代码例子,关注微信公众号【有关SQL】,回复【5000】,就可以看到这些真实的源代码。 写好SQL代码,素质当然远不止这些!

    1K10

    如何写好SQL:企业内训文档

    适用范围:本培训文档适用于公司所有涉及SQL编写、维护、优化的岗位人员,涵盖MySQL、Oracle、SQL SERVER等关系型数据库,OceanBase分布式数据库,以及HIVE、Doris等大数据处理引擎...2.1 关系型数据库表设计(MySQL、Oracle、SQL SERVER) 2.1.1 核心理论 1) 遵循三大范式(核心是减少数据冗余) 第一范式(1NF):列不可再分,确保每一列都是原子值(如“联系方式...4)主键与外键设计:主键需唯一、非空,优先使用自增ID(MySQL)、序列(Oracle)、IDENTITY(SQL SERVER);外键用于关联表,确保数据一致性,但高频写入场景可适当省略(通过业务逻辑保证一致性...3.1 关系型数据库索引(MySQL、Oracle、SQL SERVER) 3.1.1 核心理论 索引类型:主键索引(唯一、非空,默认创建)、唯一索引(唯一,可空)、普通索引(无约束)、联合索引(多列组合...,遵循“最左前缀原则”)、聚簇索引(MySQL InnoDB主键默认聚簇索引,数据与索引存储在一起;Oracle、SQL SERVER聚簇索引需手动创建)。

    27611

    如何写得一手好SQL ?

    博主负责的项目主要采用阿里云数据库MySQL,最近频繁出现慢SQL告警,执行时间最长的竟然高达5分钟。...改造这些SQL的过程中,总结了一些经验分享给大家,如果有错误欢迎批评指正。 MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。...实施原则 相比NoSQL数据库,MySQL是个娇气脆弱的家伙。它就像体育课上的女同学,一点纠纷就和同学闹别扭(扩容难),跑两步就气喘吁吁(容量小并发低),常常身体不适要请假(SQL约束太多)。...MySQL就是鱼塘,最大并发数和网络带宽就是出水口,用户SQL就是漂浮物。微信搜索web_resource 关注获取更多推送。...只好用游标了,感兴趣的朋友阅读JDBC使用游标实现分页查询的方法 其他数据库 作为一名后端开发人员,务必精通作为存储核心的MySQL或SQL Server,也要积极关注NoSQL数据库,他们已经足够成熟并被广泛采用

    95330
    领券