返回顶部
首页 > 资讯 > 数据库 >【Mysql】一篇学会SQL中的递归的用法
  • 950
分享到

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

sqlmysql数据库 2023-09-03 05:09:47 950人浏览 泡泡鱼
摘要

【Mysql】sql高级技巧——递归用法及案例详解 1. SQL递归概念:          SQL递归查询是一种用于处理具有层次结构的数据的技术。它使用递归函数来遍历树形结构,例如组织结构、分类结构等等。         递归查询通常使用

Mysqlsql高级技巧——递归用法及案例详解

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 pathFROM company_departmentWHERE parent_department_id IS NULLUNION ALLSELECT cd.department_id, cd.department_name, cd.parent_department_id, dt.depth + 1 AS depth, CONCAT(dt.path, ',', cd.department_id) AS pathFROM company_department cdJOIN department_tree dt ON cd.parent_department_id = dt.department_id)SELECT department_id, department_name, parent_department_id, depth, pathFROM department_treeORDER 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.查询结果截图:

来源地址:https://blog.csdn.net/yqyn6/article/details/129795916

您可能感兴趣的文档:

--结束END--

本文标题: 【Mysql】一篇学会SQL中的递归的用法

本文链接: https://lsjlt.com/news/391625.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 【Mysql】一篇学会SQL中的递归的用法
    【Mysql】SQL高级技巧——递归用法及案例详解 1. SQL递归概念:          SQL递归查询是一种用于处理具有层次结构的数据的技术。它使用递归函数来遍历树形结构,例如组织结构、分类结构等等。         递归查询通常使用...
    99+
    2023-09-03
    sql mysql 数据库
  • SQL中的递归原理
    这篇文章主要介绍“SQL中的递归原理”,在日常操作中,相信很多人在SQL中的递归原理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SQL中的递归原理”的疑惑有所帮助!接下来,...
    99+
    2024-04-02
  • C++ 递归函数在数学归纳法中的应用?
    数学归纳法通过递归函数在 c++++ 中得以实现,通过证明基本情况和归纳步骤,即可证明给定的命题对所有自然数成立。例如,上述代码证明了“所有自然数 n,n^2 + n + 41 是素数”...
    99+
    2024-04-19
    c++ 递归
  • mysql 递归函数with recursive的用法
    AS 用法: AS在mysql用来给列/表起别名. 有时,列的名称是一些表达式,使查询的输出很难理解。要给列一个描述性名称,可以使用列别名。 要给列添加别名,可以使用AS关键词后跟别名 例子1: SE...
    99+
    2023-09-02
    mysql 数据库 database
  • 【Java基础篇】方法的使用(方法的重载和递归)
    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏:Java.SE,本专栏主要讲解运算符,程序逻辑控制,方法的使用,数组的使用,类和对象,继承和多态,抽象类和接口等内容 ...
    99+
    2023-08-20
    java 开发语言 jvm
  • C++ 函数递归详解:分治法中的递归应用
    递归是一种函数自我调用的技术,适用于可分解成较小规模子问题的问题。分治法采用递归将问题分解成独立子问题,逐步解决。如 findmaximum() 函数递归查找数组中最大值,通过检查基本情...
    99+
    2024-05-03
    c++ 递归
  • 一篇文章学会GO语言中的变量
    目录1.标识符2.关键字3.变量3.1 Go语言中变量的声明3.2 批量声明3.3 变量的初始化3.4 短变量声明3.5匿名变量4.常量5.iota总结1.标识符 在编程语言中标识符...
    99+
    2024-04-02
  • C++ 函数递归详解:回溯法中的递归
    c++++ 函数递归详解:递归是函数调用自身的一种技术,在回溯法等算法中很有用。回溯法是通过系统地尝试所有解决方案并回溯到死胡同时来解决问题的。数独求解是递归函数在回溯法中实际应用的例子...
    99+
    2024-05-03
    c++ 回溯法 函数递归
  • Java中的递归方法怎么用
    小编给大家分享一下Java中的递归方法怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!递归方法定义本身调用方法本身的现象叫做递归在这之前我们学的东西:例如St...
    99+
    2023-06-22
  • python递归调用的用法
    这篇文章主要讲解了“python递归调用的用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python递归调用的用法”吧!题目:    一个5位数,...
    99+
    2023-06-04
  • C++ 函数的递归实现:递归在计算机图形学中的应用示例?
    递归在计算机图形学中有广泛应用,包括生成分形(使用递归函数生成自相似几何形状):例如,科赫曲线分形是通过一个递归函数绘制的,该函数每次调用时生成原始形状的较小版本。递归还用于遍历场景图,...
    99+
    2024-04-23
    函数 递归 c++
  • mysql递归函数with recursive的用法举例
    目录AS 用法:例子1:例子2:with(Common Table Expressions/CTE)用法:语法:例子1:例子2:例子3:with的合法用法:简单递归用法:例子1:递归得到依次递增的序列:例子2:递归得到不...
    99+
    2022-08-16
    mysql递归函数的用法 mysql 递归函数 递归函数 sql
  • 一篇文章教会你PYcharm的用法
    目录一、界面介绍二、设置中文(无需汉化包)三、常用快捷键一些常用设置:四、Python 标识符和关键字1、标识符2、 关键字五、行和缩进六、Python 引号七、Python注释1、...
    99+
    2024-04-02
  • SQL的递归查询子/父节点结构(MySQL)
    当数据库中存储了树型结构的数据,例如城市表时,我们要搜索一个城市的所有父级城市或所有的子级城市,首先想到的就是利用SQL的递归查询,来看下面的MySQL例子(下列例子MySQL只适用于8.0版本及以上): 下载SQL,执行 表结构和数据S...
    99+
    2023-08-17
    sql 数据库 mysql
  • mysql实现递归查询的方法
    小编给大家分享一下mysql实现递归查询的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!mysql实现递归查询的方法:首先创建表,并初始化数据;然后向下递归,利用【find_in_set(...
    99+
    2024-04-02
  • 一文学会docker 安装mysql的方法
    目录1、使用 docker 命令下载 mysql2、使用 docker 命令创建实例并启动;3、修改 mysql 配置文件;4、重新启动 mysql;1、使用 docker 命令下载...
    99+
    2024-04-02
  • 一篇文章学会jsBridge的运行机制
    目录js调用方式安卓1.js调用原生2.原生调用jsios总结我司的APP是一个典型的混合开发APP,内嵌的都是前端页面,前端页面要做到和原生的效果相似,就避免不了调用一些原生的方法...
    99+
    2024-04-02
  • C++ 函数的递归实现:递归在人工智能算法中的作用?
    递归函数通过调用自身并在特定条件下返回结果来实现。在人工智能算法中,递归广泛应用于深度优先搜索、动态规划、回溯和神经网络等技术。对于处理复杂问题,递归提供了高效且简洁的解决方案。 C+...
    99+
    2024-04-22
    人工智能 递归 python c++
  • PL/SQL中的递归查询怎么实现
    在PL/SQL中,可以使用递归函数来实现递归查询。递归函数是指在函数内部调用自身的函数。 以下是一个示例,演示了如何在PL/SQL中...
    99+
    2024-05-08
    PL/SQL
  • C++ 函数的递归实现:递归的常见用法有哪些?
    递归是一种函数调用自身的技术,广泛应用于分步求解问题的场景。在 c++++ 中,递归有以下常见用法:求解斐波那契数列计算阶乘计算排列组合遍历树形结构解决迷宫求解问题 C++ 函数的递归...
    99+
    2024-04-22
    递归 c++函数 c++ 排列
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作