【Mysql】一篇学会SQL中的递归的用法

这篇具有很好参考价值的文章主要介绍了【Mysql】一篇学会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递归优缺点:

 优点:

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

缺点:

  1. 性能:SQL递归查询通常比其他方法慢。这是因为它需要进行多次递归函数调用,并且可能需要访问大量的数据。如果不正确地编写递归查询算法,还可能会导致死循环等问题,从而影响性能。
  2. 复杂性:递归查询算法通常比其他方法更复杂。如果不熟悉递归算法,编写正确的递归查询算法可能很困难。
  3. 可伸缩性: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,数据库文章来源地址https://www.toymoban.com/news/detail-638710.html

到了这里,关于【Mysql】一篇学会SQL中的递归的用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基础SQL语法语句大全(一篇学会所有SQL语句)

       如:select distinct name from student;  如:select name,salary from employee where deptno = 3;  如:select * from employees where deptno = 3 and salary-5000;(两个条件同时满足) select * from employees where (deptno =3 or depton =1) and salary 5000;  如:select * from dept where loc like \\\'一楼%\\\';(表示查找loc字段中以一楼开

    2023年04月17日
    浏览(56)
  • MySQL 中的 SQL 查询性能调优

            通过 MySQL 中的索引加速 SQL 查询。安装、分析查询并使用存储过程以获得最佳结果。         在本文中,我们将了解索引表列如何帮助提高 SQL 查询的快速响应时间。我们将介绍安装 MySQL、创建存储过程、分析查询以及了解索引的影响的步骤。         我在

    2024年02月12日
    浏览(45)
  • SQL的substring函数及其用法实例——MYSQL另一种截取目标字符的函数

    目录 1.substring()的语法和用法实例 (1)两个参数的语法和用法实例 ①语法:substring(string ,index)|substring(string from index) ②用法实例: 从指定字符串的某序数开始获取字符 (2)三个参数的语法和用法实例 ①语法:substring(string ,index,len)|substring(string from index for len) ②用法实

    2023年04月08日
    浏览(85)
  • SQL中的UNION和UNION ALL的区别及用法详解、“提高SQL查询效率:UNION和UNION ALL的比较、使用实例详解SQL中的UNION和UNION ALL操作符

    UNION 和 UNION ALL 都是 SQL 中用于将多个 SELECT 语句的结果合并成一个结果集的操作符。它们都适用于需要将多个表或查询结果合并在一起的情况。但是它们的行为略有不同。 UNION 和 UNION ALL 的区别在于, UNION 会将结果集合并成一个不含重复行的结果集,而 UNION ALL 则会保留所有

    2024年02月03日
    浏览(64)
  • 【SQL】MySQL中的窗口函数(开窗函数)

    窗口函数是 MYSQL8.0 新增的 聚合函数: 多行变一行,常见的sum,count,max,min 窗口函数: 行数不变,常见的row_number,rank 语法格式: 窗口函数(表达式) over (partition by … order by … frame_clause) partition by是分区,类似于group by,如去掉相当于对所有数据进行计算 order by排序 frame_c

    2024年02月07日
    浏览(51)
  • SQL中的单条件判断函数IF,和多条件判断CASE WHEN的用法

    在SQL中,条件判断函数IF用于根据指定的条件返回不同的值。 condition:要判断的条件。 value_if_true:如果条件为真,则返回的值。 value_if_false:如果条件为假,则返回的值。 假设有如下名为studensts的表,包含id、name和score字段: 我们想根据学生的分数判断是否及格,并返回相

    2024年02月11日
    浏览(86)
  • SQL高级:递归查询

    如果在单表或两表中存储了 树形结构 数据,那么在查询这些数据时,就有可能要用到递归查询。 在实际的业务场景中, 树形结构 的数据很常见。比如组织架构、产品材料清单、产品大类和小类等等。 递归查询也是一个很有趣的知识点。我们来学习一下它。 为了学习这个知

    2024年02月03日
    浏览(53)
  • sql递归查询

    一、postgresql 递归sql   sql中with xxxx as () 是对一个查询子句做别名,同时数据库会对该子句生成临时表; with recursive 则是一个递归的查询子句,他会把查询出来的结果再次代入到查询子句中继续查询 p为自定义临时表名,最后一句select后跟的字段必须小于等于t1和t2中字段。 第

    2024年02月11日
    浏览(36)
  • 递归sql查询完整科目名称

    已知表 科目编号 科目名称 1001 1001 现金 1002 1002 银行存款 10020100 0100 工商银行存款 100201000001 0001 工行重庆路支行 10020200 0200 建设银行存款 100202000001 0001 建行铁北支行 需要整理成 科目编号 科目称 科目全称 1001 现金 现金 1002 银行存款 银行存款 10020100 工商银行存款 银行存款

    2024年02月08日
    浏览(41)
  • mysql 自定义函数,返回值为sql查询后的某个字段的值

    函数框架:如果使用的是 Navicat 等可视化工具,通过点击界面填写相应的条件就可以得到函数框架 1、definer 翻译成中文是“定义者”的意思。MySQL中,创建视图(view)、函数(function)、存储过程(procedure)、触发器(trigger)、事件(event)时,都可以指定 DEFINER = user 选项,即指定此对象

    2024年01月18日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包