iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >mysql 递归函数with recursive的用法
  • 734
分享到

mysql 递归函数with recursive的用法

mysql数据库database 2023-09-02 15:09:16 734人浏览 安东尼
摘要

AS 用法: AS在Mysql用来给列/表起别名. 有时,列的名称是一些表达式,使查询的输出很难理解。要给列一个描述性名称,可以使用列别名。 要给列添加别名,可以使用AS关键词后跟别名 例子1: SE

AS 用法:

AS在Mysql用来给列/表起别名.
有时,列的名称是一些表达式,使查询的输出很难理解。要给列一个描述性名称,可以使用列别名。
要给列添加别名,可以使用AS关键词后跟别名

例子1:

SELECT  [column_1 | expression] AS col_nameFROM table_name;

如果别名包含空格,则必须引用以下内容:

例子2:

SELECT  [column_1 | expression] AS 'col name'FROM table_name;

with(Common Table Expressions/CTE)用法:

with在mysql中被称为公共表达式,可以作为一个临时表然后在其他结构中调用.如果是自身调用那么就是后面讲的递归.

语法:

with_clause:    WITH [RECURSIVE]        cte_name [(col_name [, col_name] ...)] AS (subquery)        [, cte_name [(col_name [, col_name] ...)] AS (subquery)] ...

cte_name :公共表达式的名称,可以理解为表名,用来表示as后面跟着的子查询
col_name :公共表达式包含的列名,可以写也可以不写

例子1:

WITH  cte1 AS (SELECT a, b FROM table1),  cte2 AS (SELECT c, d FROM table2)SELECT b, d FROM cte1 JOIN cte2WHERE cte1.a = cte2.c;

例子2:

WITH cte (col1, col2) AS(  SELECT 1, 2  UNION ALL  SELECT 3, 4)SELECT col1, col2 FROM cte;

例子3:

这里的第一个as后面接的是子查询,第二个as表示列名,而不是子查询.

WITH cte AS(  SELECT 1 AS col1, 2 AS col2  UNION ALL  SELECT 3, 4)SELECT col1, col2 FROM cte;

with的合法用法:

  • 在子查询(包括派生的表子查询)的开始处
SELECT ... WHERE id IN (WITH ... SELECT ...) ...SELECT * FROM (WITH ... SELECT ...) AS dt ...
  • 同一级别只允许一个WITH子句。同一级别的WITH后面跟着WITH是不允许的,下面是非法用法:
WITH cte1 AS (...) WITH cte2 AS (...) SELECT ...

改为合法用法:

WITH cte1 AS (SELECT 1)SELECT * FROM (WITH cte2 AS (SELECT 2) SELECT * FROM cte2 JOIN cte1) AS dt;

在这里面as代表列名,sql不是顺序执行的,这一点了解的话就很好理解这个as了

简单递归用法:

首先我们引出一个问题: 什么叫做递归?
递归:给定函数初始条件,然后反复调用自身直到终止条件.

例子1:递归得到依次递增的序列:

WITH RECURSIVE cte (n) AS(  SELECT 1  UNION ALL  SELECT n + 1 FROM cte WHERE n < 5)SELECT * FROM cte;

运行结果:

+------+| n    |+------+|    1 ||    2 ||    3 ||    4 ||    5 |+------+

官方文档中对于这个写法的解释:

At each iteration, that SELECT produces a row with a new value one greater than the value of n from the previous row set. The first iteration operates on the initial row set (1) and produces 1+1=2; the second iteration operates on the first iteration’s row set (2) and produces 2+1=3; and so forth. This continues until recursion ends, which occurs when n is no longer less than 5.

python实现就是:

def cte(n):print(n)if n<5:cte(n+1)

也就是说,一个with recursive 由两部分组成.第一部分是非递归部分(union all上方),第二部分是递归部分(union all下方).递归部分第一次进入的时候使用非递归部分传递过来的参数,也就是第一行的数据值,进而得到第二行数据值.然后根据第二行数据值得到第三行数据值.

例子2:递归得到不断复制的字符串

这里的as表示列名,表示说这个CTE有两个列,也可以写为with cte(n,str) as (subquery)

WITH RECURSIVE cte AS(  SELECT 1 AS n, 'abc' AS str  UNION ALL  SELECT n + 1, CONCAT(str, str) FROM cte WHERE n < 3)SELECT * FROM cte;

结果:

+------+------+| n    | str  |+------+------+|    1 | abc  ||    2 | abc  ||    3 | abc  |+------+------+

这里的话concat是每一次都连接一个str,这个str来自上一行的结果,但是最终输出却是每一行都没有变化的值,这是为什么?
这是因为我们在声明str的时候限制了它的字符长度,使用 类型转换CAST(‘abc’ AS CHAR(30)) 就可以得到复制的字符串了.
**注意:**这里也可能会报错,看mysql模式.在严格模式下这里会显示Error Code: 1406. Data too long for column 'str' at row 1
关于strict SQL mode和nonstrict SQL mode:mysql 严格模式 Strict Mode说明

WITH RECURSIVE cte AS(  SELECT 1 AS n, CAST('abc' AS CHAR(20)) AS str  UNION ALL  SELECT n + 1, CONCAT(str, str) FROM cte WHERE n < 3)SELECT * FROM cte;
+------+--------------+| n    | str          |+------+--------------+|    1 | abc          ||    2 | abcabc       ||    3 | abcabcabcabc |+------+--------------+

当然,如果上一行的值有多个,我们还可以对多个值进行重新组合得到我们想要的结果,比如下面这个例子.

例子3:生成斐波那契数列

WITH RECURSIVE fibonacci (n, fib_n, next_fib_n) AS(  SELECT 1, 0, 1  UNION ALL  SELECT n + 1, next_fib_n, fib_n + next_fib_n    FROM fibonacci WHERE n < 10)SELECT * FROM fibonacci;

结果:

+------+-------+------------+| n    | fib_n | next_fib_n |+------+-------+------------+|    1 |     0 |          1 ||    2 |     1 |          1 ||    3 |     1 |          2 ||    4 |     2 |          3 ||    5 |     3 |          5 ||    6 |     5 |          8 ||    7 |     8 |         13 ||    8 |    13 |         21 ||    9 |    21 |         34 ||   10 |    34 |         55 |+------+-------+------------+

语法说明:

UNION ALL与UNION DISTINCT

  • UNION ALL:
    非递归部分和递归部分用UNION ALL分隔,那么所有的行都会被加入到最后的表中
  • UNION DISTINCT:
    非递归部分和递归部分用UNION DISTINCT分隔,重复的行被消除。这对于执行传递闭包的查询非常有用,以避免无限循环。

limit控制递归次数

recursive(第二个select)不能使用的结构:

官网的描述:

  • The recursive SELECT part must not contain these constructs:

    Aggregate functions such as SUM()Window functionsGROUP BYORDER BYDISTINCT

限制递归次数/时间:

当出现不符合设置情况的会报错,分为以下几种设置方法:

  • cte_max_recursion_depth :default 设置为1000,表达递归的层数.可以使用如下语句修改这个值:
SET SESSION cte_max_recursion_depth = 10;      -- permit only shallow recursionSET SESSION cte_max_recursion_depth = 1000000; -- permit deeper recursion

当然也可以设置为global,也就是set global cte_max_recursion_depth = 1000000;这样子就对全局的递归都有限制

  • max_execution_time :设置最近的递归时间
SET max_execution_time = 1000; -- impose one second timeout
  • MAX_EXECUTION_TIME:设置全局的递归时间

官网文档说明如下:

  • The cte_max_recursion_depth system variable enforces a limit on the
    number of recursion levels for CTEs. The server terminates execution
    of any CTE that recurses more levels than the value of this variable.

  • The max_execution_time system variable enforces an execution timeout
    for SELECT statements executed within the current session.

  • The MAX_EXECUTION_TIME optimizer hint enforces a per-query execution
    timeout for the SELECT statement in which it appears.

  • limit:限之最大行的数量

WITH RECURSIVE cte (n) AS(  SELECT 1  UNION ALL  SELECT n + 1 FROM cte LIMIT 10000)SELECT * FROM cte;

来源地址:https://blog.csdn.net/mjfppxx/article/details/124879326

您可能感兴趣的文档:

--结束END--

本文标题: mysql 递归函数with recursive的用法

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql 递归函数with recursive的用法
    AS 用法: AS在mysql用来给列/表起别名. 有时,列的名称是一些表达式,使查询的输出很难理解。要给列一个描述性名称,可以使用列别名。 要给列添加别名,可以使用AS关键词后跟别名 例子1: SE...
    99+
    2023-09-02
    mysql 数据库 database
  • MySQL数据库的递归查询with recursive
    原因:         当我们在实际的开发流程中,我们会遇到需要递归查询的一些数据,例如:课程分类表是一个树型结构,其中parentid字段为父结点ID,它是树型结构的标志字段。 如果树的层级固定可以使用表的自链接去查询,比如:我们只查询两...
    99+
    2023-09-08
    sql 数据库
  • C++ 函数递归详解:分治法中的递归应用
    递归是一种函数自我调用的技术,适用于可分解成较小规模子问题的问题。分治法采用递归将问题分解成独立子问题,逐步解决。如 findmaximum() 函数递归查找数组中最大值,通过检查基本情...
    99+
    2024-05-03
    c++ 递归
  • C++ 函数递归详解:递归的替代方法
    递归是一种函数调用自身的技术,但存在堆栈溢出和效率低下的缺点。替代方法包括:尾递归优化,由编译器优化递归调用为循环;迭代,使用循环而不是递归;协程,允许暂停和恢复执行,模拟递归行为。 ...
    99+
    2024-05-01
    c++ 递归 堆栈溢出
  • C++ 函数递归详解:回溯法中的递归
    c++++ 函数递归详解:递归是函数调用自身的一种技术,在回溯法等算法中很有用。回溯法是通过系统地尝试所有解决方案并回溯到死胡同时来解决问题的。数独求解是递归函数在回溯法中实际应用的例子...
    99+
    2024-05-03
    c++ 回溯法 函数递归
  • C++ 函数的递归实现:递归的常见用法有哪些?
    递归是一种函数调用自身的技术,广泛应用于分步求解问题的场景。在 c++++ 中,递归有以下常见用法:求解斐波那契数列计算阶乘计算排列组合遍历树形结构解决迷宫求解问题 C++ 函数的递归...
    99+
    2024-04-22
    递归 c++函数 c++ 排列
  • C++ 函数的递归实现:递归与非递归算法的比较分析?
    递归算法通过函数自调用解决结构化的问题,优点是简洁易懂,缺点是效率较低且可能发生堆栈溢出;非递归算法通过显式管理堆栈数据结构避免递归,优点是效率更高且避免堆栈溢出,缺点是代码可能更复杂。...
    99+
    2024-04-22
    c++ 递归 堆栈溢出
  • C++ 递归函数在数学归纳法中的应用?
    数学归纳法通过递归函数在 c++++ 中得以实现,通过证明基本情况和归纳步骤,即可证明给定的命题对所有自然数成立。例如,上述代码证明了“所有自然数 n,n^2 + n + 41 是素数”...
    99+
    2024-04-19
    c++ 递归
  • PHP递归函数算法和应用
    这篇文章主要介绍“PHP递归函数算法和应用”,在日常操作中,相信很多人在PHP递归函数算法和应用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP递归函数算法和应用”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-17
  • Golang函数的递归调用实现方法
    Golang函数的递归调用实现方法随着Golang在软件开发中的广泛应用,函数的递归调用成为了程序员们实现复杂逻辑和算法的重要手段。递归调用是指在函数内部不断地调用自身,直至满足某一个条件终止循环。在本文中,我们将探讨Golang函数的递归...
    99+
    2023-05-17
    函数 Golang 递归调用
  • C++ 函数的递归实现:递归在人工智能算法中的作用?
    递归函数通过调用自身并在特定条件下返回结果来实现。在人工智能算法中,递归广泛应用于深度优先搜索、动态规划、回溯和神经网络等技术。对于处理复杂问题,递归提供了高效且简洁的解决方案。 C+...
    99+
    2024-04-22
    人工智能 递归 python c++
  • matlab递归调用函数的方法是什么
    在MATLAB中,递归调用函数的方法与其他编程语言类似。要使用递归调用函数,首先需要定义一个函数,并在函数体内调用自身。以下是一个简...
    99+
    2023-08-19
    matlab
  • Python函数的递归方法是什么
    本篇内容介绍了“Python函数的递归方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!函数调用自身的 编程技巧 称为递归。1.1、递...
    99+
    2023-06-22
  • python函数递归调用的实现
    目录引入函数递归介绍函数递归原理及使用Practice引入 函数既可以嵌套定义也可以嵌套调用。嵌套定义指的是在定义一个函数时在该函数内部定义另一个函数;嵌套调用指的是在调用一个函数的...
    99+
    2023-05-19
    python函数递归调用 python 递归调用
  • JS的递归函数怎么使用
    这篇文章主要介绍了JS的递归函数怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JS的递归函数怎么使用文章都会有所收获,下面我们一起来看看吧。编程语言中,函数Func(T...
    99+
    2024-04-02
  • C++ 函数递归详解:递归的定义和原理
    递归是一种函数调用自我的编程技术,通过将问题分解成较小问题、设置边界条件和递减问题来实现。以求斐波那契数列为例,递归函数使用边界条件(n ≤ 1)和递减问题(fib(n - 1) + f...
    99+
    2024-05-01
    函数 递归 c++
  • C++ 函数递归详解:递归的复杂度分析
    递归是一种函数调用自身的过程。递归的时间复杂度可以通过计算递归调用次数来分析,例如阶乘函数为 o(n^2),斐波那契数列第 n 项的递归函数为 o(φ^n),其中 φ 是黄金比。 C+...
    99+
    2024-05-04
    c++ 函数递归
  • Python函数的递归详解
    目录1.1、递归函数的特点 1.2 递归案例 ----- 计算数字累加 总结 函数调用自身的 编程技巧 称为递归。 1.1、递归函数的特点 特点: 一个函数 内部 调用自己。 ...
    99+
    2024-04-02
  • C++ 函数的递归实现:递归与动态规划算法的异同?
    递归是一种函数自行调用的技术,c++++ 中使用 recursion 关键字定义递归函数。递归函数的语法为:returntype functionname(parameters) { i...
    99+
    2024-04-22
    递归 动态规划 c++
  • C++ 函数递归详解:递归调用的形式和实现
    递归是函数自身调用的一种编程技术,在 c++++ 中有两种常见形式:直接递归和间接递归。要实现递归,函数必须满足基线条件和递归调用。实战案例中,利用递归计算阶乘,其基线条件是 n 为 0...
    99+
    2024-05-04
    c++ 递归
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作