一篇文章学会SQL中的递归用法(Mysql)

 更新时间:2023年10月23日 08:33:10   作者:yqyn  
这篇文章主要给大家介绍了关于如何一篇文章学会SQL中的递归用法,众所周知目前的mysql版本中并不支持直接的递归查询,但是通过递归到迭代转化的思路,还是可以在一句SQL内实现树的递归查询的,需要的朋友可以参考下

1. SQL递归概念:

SQL递归查询是一种用于处理具有层次结构的数据的技术。它使用递归函数来遍历树形结构,例如组织结构、分类结构等等。

递归查询通常使用 " WITH RECURSIVE " 语句实现。

WITH RECURSIVE 语句包含两部分:

a.递归部分: 定义了如何递归查询数据;            

b.终止条件部分: 定义了递归查询何时停止。

2. SQL递归一般形式:

WITH RECURSIVE recursive_query_name (col1, col2, ..., coln) AS (
    -- 递归部分
    SELECT 
			initial_query_result_col1, 
			initial_query_result_col2, 
			...,
			initial_query_result_coln
    FROM initial_query
    UNION ALL
    SELECT 
			recursive_query_result_col1,
			recursive_query_result_col2, 
			..., 
			recursive_query_result_coln
    FROM recursive_query_name, recursive_query
    WHERE recursive_query_condition
)
-- 终止条件部分
SELECT * FROM recursive_query_name WHERE termination_condition;

在递归部分,我们先通过一个初始查询(initial_query)得到一些初始的结果。然后我们通过UNION ALL运算将初始结果集合并到递归查询结果中。接下来,在每次递归查询中,我们使用前一次递归的结果(recursive_query_name)与递归查询(recursive_query)进行运算,并使用WHERE条件过滤掉不需要的数据。最后,在终止条件部分中,我们使用一个条件来判断递归查询何时停止。当递归查询到终止条件时,递归查询结束,最终结果被返回。

3. SQL递归优缺点:

 优点:

  • 灵活性:SQL递归查询适用于各种类型的树形结构,而且可以根据具体的需要自定义递归查询算法。
  • 可读性:递归查询通常比使用嵌套查询或连接查询更易于阅读和理解。它可以用简单的SQL语句来表示一个复杂的树形结构。
  • 便于维护:SQL递归查询通常比其他方法更易于维护。例如,如果要更改树形结构中的某些节点,只需更改递归查询算法即可。

缺点:

  • 性能:SQL递归查询通常比其他方法慢。这是因为它需要进行多次递归函数调用,并且可能需要访问大量的数据。如果不正确地编写递归查询算法,还可能会导致死循环等问题,从而影响性能。
  • 复杂性:递归查询算法通常比其他方法更复杂。如果不熟悉递归算法,编写正确的递归查询算法可能很困难。
  • 可伸缩性:SQL递归查询不适合处理大型数据集。当数据集变得太大时,查询可能会变得非常缓慢,甚至无法运行。

总体而言,SQL递归查询是一种非常有用的技术,可以处理树形结构的数据。虽然它具有一些缺点,但在正确使用的情况下,它仍然是一种非常强大和灵活的工具。

4.案例:公司部门关系递归查询

a.按DDL建表:

CREATE TABLE company_department (
    department_id INT PRIMARY KEY,
    department_name VARCHAR(50),
    parent_department_id INT REFERENCES company_department(department_id)
);

b.插入数据:

INSERT INTO company_department 
    (department_id, department_name, parent_department_id)
VALUES
    (1, '公司', NULL),
    (2, '人力资源部', 1),
    (3, '财务部', 1),
    (4, '市场部', 1),
    (5, '技术部', 1),
    (6, '招聘部', 2),
    (7, '薪资部', 2),
    (8, '成本控制部', 3),
    (9, '收支管理部', 3),
    (10, '品牌推广部', 4),
    (11, '销售部', 4),
    (12, '前端开发部', 5),
    (13, '后端开发部', 5)

c.递归查询公司部门关系SQL语句

WITH RECURSIVE department_tree (department_id, department_name, parent_department_id, depth, path) AS (
		SELECT 
			department_id, 
			department_name, 
			parent_department_id, 
			1 AS depth, 
			CAST(department_id AS CHAR(200)) AS path
		FROM company_department
		WHERE parent_department_id IS NULL
		UNION ALL
		SELECT 
			cd.department_id, 
			cd.department_name, 
			cd.parent_department_id, 
			dt.depth + 1 AS depth, 
			CONCAT(dt.path, ',', cd.department_id) AS path
		FROM company_department cd
			JOIN department_tree dt ON cd.parent_department_id = dt.department_id
	)
SELECT 
	department_id, department_name, parent_department_id, depth, path
FROM department_tree
ORDER BY path;

d.sql案例详解:

这个查询使用了递归公共表达式来遍历公司部门关系。公共表达式使用了两个 SELECT 语句:

第一个 SELECT 语句选取了所有没有父部门的根部门,并将它们添加到临时表 department_tree 中。它们的深度被初始化为 1,并且它们的路径被设置为它们的部门 ID。这个 SELECT 语句是递归查询的起点。

第二个 SELECT 语句连接了 company_department 表和 department_tree 表。它选取了 company_department 表中所有具有父部门的部门,并连接到 department_tree 表中已经存在的部门。对于每个连接的行,它们的深度是父部门的深度加 1,并且它们的路径是父部门的路径加上逗号和它们自己的部门 ID。

查询返回了 department_tree 表中所有的部门,按照它们的路径排序。这个排序方法使得在结果集中,每个部门都在它们的父部门之后,并且它们的顺序是深度优先遍历的顺序。        

e.查询结果截图:

总结

到此这篇关于SQL中递归用法(Mysql)的文章就介绍到这了,更多相关SQL递归用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MYSQL表中某字段所有值大小写转换

    MYSQL表中某字段所有值大小写转换

    这篇文章主要为大家介绍了MYSQL表中某字段所有值大小写转换示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 浅谈mysql哪些情况会导致索引失效

    浅谈mysql哪些情况会导致索引失效

    索引在我们使用MySQL数据库时可以极大的提高查询效率,然而,有时候因为使用上的一些瑕疵就会导致索引的失效,无法达到我们使用索引的预期效果,本文就介绍一下几种索引失效的方法
    2021-11-11
  • MLSQL编译时权限控制示例详解

    MLSQL编译时权限控制示例详解

    这篇文章主要给大家介绍了关于MLSQL编译时权限控制的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • 实例详解mysql子查询

    实例详解mysql子查询

    这篇文章主要介绍了mysql子查询的相关资料,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-09-09
  • mysql跨库事务XA操作示例

    mysql跨库事务XA操作示例

    这篇文章主要介绍了mysql跨库事务XA操作,结合实例形式分析了php+mysql实现跨库事务XA操作具体操作步骤与相关注意事项,需要的朋友可以参考下
    2019-04-04
  • 简单实现SQLServer转MYSQL的方法

    简单实现SQLServer转MYSQL的方法

    SqlServer数据转换成mysql数据,可以说是一个老生常谈了,网上也有很多的方法,今天我们来看一种不一样的方法,而且也非常的简单,虽然有点小缺陷,但还是不失为一种很好的方法,当然如果结合mss2sql那就非常完美了
    2014-08-08
  • 5个常用的MySQL数据库管理工具详细介绍

    5个常用的MySQL数据库管理工具详细介绍

    本篇文章是对5个常用的MySQL数据库管理工具进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • PHP之Mysql常用SQL语句示例的深入分析

    PHP之Mysql常用SQL语句示例的深入分析

    本篇文章是对Mysql常用SQL语句进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 深入理解Mysql的四种隔离级别

    深入理解Mysql的四种隔离级别

    开发工作中我们会使用到事务,那你们知道事务又分哪几种吗?MYSQL标准定义了4类隔离级别,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低的隔离级一般支持更高的并发处理,并拥有更低的系统开销。下面通过这篇文章我们来一起深入理解Mysql中的四种隔离级别。
    2016-11-11
  • mysql8.0.12如何重置root密码

    mysql8.0.12如何重置root密码

    这篇文章主要为大家详细介绍了mysql8.0.12如何重置root密码,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11

最新评论