当前位置: 首页 > 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. 合并结果
    • 将递归查询的结果与初始查询的结果进行合并,得到最终的查询结果。

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

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

相关文章:

  • 数据结构和算法——用C语言实现所有排序算法
  • C# WPF: Imag图片填充方式有哪些?
  • Docker 容器服务的注册、发现及Docker安全
  • 十八、模型构建器(ModelBuilder)快速提取城市建成区——批量掩膜提取夜光数据、夜光数据转面、面数据融合、要素转Excel(基于参考比较法)
  • 10.25verilog复习,代码规范复盘,触发器复习
  • Day 4 登录页及路由 (二) -- Vue状态管理
  • 边缘计算技术的崭新篇章:赋能未来智能系统
  • 在Spring boot中 使用JWT和过滤器实现登录认证
  • 【年终特惠】全流程HEC-RAS 1D/2D水动力与水环境模拟技术案例实践及拓展应用
  • 9.Python3-注释
  • 20年经典传承 | 性能圣典!火焰图发明者Brendan Gregg“神作”
  • Linux cp命令:复制文件和目录
  • 【git】git使用教程
  • [架构之路-245/创业之路-76]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 企业资源管理计划ERP
  • 第16章_变量、流程控制与游标
  • JS学习笔记——闭包
  • Logstash 参考指南(目录)
  • mongo索引构建
  • mysql常用命令汇总
  • PHP CLI应用的调试原理
  • Sass 快速入门教程
  • Spring Boot快速入门(一):Hello Spring Boot
  • SQLServer插入数据
  • vue-cli在webpack的配置文件探究
  • windows下使用nginx调试简介
  • 大整数乘法-表格法
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 如何胜任知名企业的商业数据分析师?
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 微信开放平台全网发布【失败】的几点排查方法
  • 用jQuery怎么做到前后端分离
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • # include “ “ 和 # include < >两者的区别
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (九)信息融合方式简介
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (四)c52学习之旅-流水LED灯
  • (转)ObjectiveC 深浅拷贝学习
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .net core Swagger 过滤部分Api
  • .NET Core 版本不支持的问题
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET处理HTTP请求
  • .NET企业级应用架构设计系列之技术选型
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)