当前位置: 首页 > news >正文

MySQL WITH AS及递归查询

MySQL WITH AS及递归查询

WITH AS

官网:WITH 是 SQL 中的一个关键字,用于创建临时表达式(也称为 Common Table Expression,CTE),它允许你在一个查询中临时定义一个表达式,然后在后续的查询中引用它。

理解:当我们使用WITH AS 他会帮我们创建一个临时的表,这个临时表只在本次SQL中生效。当我们使用这个临时表二次以上时,他的效率是会比我们原本写两个一模一样的子查询是要搞的。

语法

WITH cte_name (column_name1, column_name2, ...) AS (-- CTE 查询SELECT ...FROM ...WHERE ...
)
-- 主查询
SELECT ...
FROM cte_name
WHERE ...

实例

WITH UserNoDisable as (-- 查询出用户表中disable为0的数据select * from User where disable = 0
)
select Stu.*,UserNoDisable.Extra from Stu Join UserNoDisable on Stu.Id = UserNoDisable.Id
union all
select Tea.*,UserNoDisable.Extra from Tea Join UserNoDisable on Stu.Id = UUserNoDisableser.Id;
-- 通过临时表可以使用我们的SQL,变得更简洁,原本需要写两次子查询的可以替换为去查临时表这也大大的提供了我们的性能。

注意:临时表一次可以建多个。

WITH tab1 as(...),tab2 as(...) select ....

递归运算(WITH RECURSIVE AS)

在临时表的基础上添加RECURSIVE 来达到递归运算。

with RECURSIVE  tab1(n) as (-- 这里是初始条件select 1-- 使用递归需要加上UNION ALL 关键字union all-- 这里是递归查询 按什么样的规则输出值,每一次递归都会将前一次的查询结果做为输入,直到查询的结果集为空时,停止递归select n+1 from tab1 where n < 10
)
select * from tab1;结果
|n |
|1 | -- 1.初始条件结果
|2 | -- 2.拿初始条件的结果,按递归查询的规则执行一次
|3 | -- .... 那上一次的
|4 |
|5 |
|6 |
|7 |
|8 |
|9 |
|10| -- 查到这里后下一次查询结果为空了,则停止递归。

递归查询使用 WITH RECURSIVE 关键字结合递归公共表达式(RCTE)来实现。它的执行顺序可以分为以下几步:

  1. 初始查询
    • 首先执行递归查询的初始部分,也就是非递归的部分,这部分的结果作为递归查询的起点。
  2. 递归查询
    • 接着执行递归部分,这部分会基于初始查询的结果逐步地进行迭代。每次迭代会将前一次迭代的结果作为输入,然后应用递归规则。
  3. 递归终止条件
    • 在递归查询的过程中,必须定义一个终止条件(要不然就是死循环),当满足终止条件时,递归将停止。
  4. 合并结果
    • 将递归查询的结果与初始查询的结果进行合并,得到最终的查询结果。

总结来说,递归查询首先执行一个初始查询,然后基于初始查询的结果进行递归迭代,直到满足了设定的终止条件为止。最终,将递归查询的结果与初始查询的结果合并,得到最终的查询结果。

需要注意的是,在编写递归查询时,一定要谨慎地定义好递归规则和终止条件,以避免无限循环或者递归层级过深导致的性能问题。

http://www.lryc.cn/news/211138.html

相关文章:

  • Harbor私有镜像仓库搭建
  • 线段树 区间赋值 + 区间加减 + 求区间最值
  • 大模型之十九-对话机器人
  • 『力扣刷题本』:删除排序链表中的重复元素
  • Android S从桌面点击图标启动APP流程 (六)
  • Java I/O (输入/输出)
  • nodejs+vue食力派网上订餐系统-计算机毕业设计
  • 【计算机视觉】对极几何
  • 强大易于编辑的流程图组织图绘制工具draw.io Mac苹果中文版
  • c# .net6 在线条码打印基于
  • Hive SQL的编译过程
  • [架构之路-245/创业之路-76]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 企业资源管理计划ERP
  • 数据库简史:多主数据库架构的由来和华为参天引擎的机遇
  • C语言每日一练(二)
  • HashJoin 在 Apache Arrow 和PostgreSQL 中的实现
  • FL Studio21.2.0.3421最新汉化破解版中文解锁下载完整版本
  • docker在java项目中打成tar包
  • No175.精选前端面试题,享受每天的挑战和学习
  • 【网安AIGC专题10.19】论文6:Java漏洞自动修复+数据集 VJBench+大语言模型、APR技术+代码转换方法+LLM和DL-APR模型的挑战与机会
  • 解决国外镜像无法访问导致的R包无法安装问题
  • 【2021集创赛】Robei杯一等奖:基于Robei EDA工具的隔离病房看护机器人设计
  • Python之函数-传实参的两种方式
  • Hive客户端和Beeline命令行的基本使用
  • Ubuntu 22.04自动登录进入桌面
  • C#__简单了解XML文档
  • 云游数智农业世界,体验北斗时空智能
  • C# 递归算法使用简介_常用整理
  • [Python]unittest-单元测试
  • Jetpack:021-Jetpack中的滑动列表
  • 基于单片机的空气质量检测系统