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

SQL中的WITH AS语法

WITH AS介绍

        SQL中的WITH AS语法是一种强大的工具,WITH AS可以简化复杂查询的编写,提高查询的可读性和维护性,WITH AS 语句允许用户定义一个临时的结果集,这个结果集被称为公共表表达式(Common Table Expression,简称CTE)。这个临时的结果集在查询执行期间存在,并且可以在同一个查询中被多次引用,就像一个临时表一样。这种语法的使用可以使得复杂的查询变得简单,同时也可以提高查询效率。

WITH AS的优点

提升代码可读性:通过给复杂的子查询命名,WITH AS使得SQL代码的结构更加清晰,便于理解。特别是当查询涉及到多个层次的子查询时,每个CTE都可以看作是一个逻辑上的步骤,使得整个查询逻辑易于跟踪和理解。

减少代码重复:如果一个子查询需要在主查询中多次使用,使用WITH AS定义一次CTE就可以避免重复书写相同的子查询代码,这不仅可以减少代码量,也降低了出错的可能性。

优化查询性能:虽然WITH AS本身并不直接提升查询性能,但在某些情况下数据库优化器能够更好地利用CTE进行查询优化。例如,如果一个CTE被多次引用,数据库可能只需要计算一次该CTE的结果,然后复用这个结果,而不是为每次引用都执行一遍子查询。

便于实现递归查询:WITH RECURSIVE是WITH AS的一个扩展,特别适用于处理层级结构或递归关系的数据,如组织结构、文件目录等。通过递归公用表表达式,可以方便地查询具有树形结构的数据,而无需编写复杂的自连接查询。

模块化查询构建:CTE可以把一个复杂的查询分解成多个小的、可管理的部分,每个部分都可以单独测试和调试,这对于大型查询的开发和维护尤其有用。

基本用法

//单个CTE
WITH 临时表名 AS (查询SQL)
SELECT * FROM 临时表名;//多个CTE
WITH 临时表名1 AS (查询SQL),临时表名2 AS (查询SQL)
SELECT * FROM 临时表名1 JOIN 临时表名2;

CTE的定义和使用必须在同一个SQL内,因为它是一个临时表,只在查询期间存在,一个SQL也可以定义多个CTE。

具体使用示例:

//单个CTE
WITH cte AS (select 1 FROM dual)
SELECT * FROM cte;//多个CTE
WITH cte1 AS (SELECT 1 FROM dual),cte2 AS (SELECT 2 FROM dual)
SELECT * FROM cte1 JOIN cte2;

定义CTE,并为每列重命名,列表中的名称数量必须与结果集中的列数相等。

WITH cte (col1, col2) AS (SELECT 1,2 from dual)
SELECT col1, col2 FROM cte;

CTE嵌套

定义CTE也可以使用前面定义的CTE,如:

WITH cte1 AS (SELECT 1 FROM dual),cte2 AS (SELECT * FROM cte1)//使用cte1生成cte2
SELECT * FROM cte2;

递归查询

递归查询是CTE的一个重要特性,即CTE定义的可以使用本身,递归CTE的语法为:WITH RECURSIVE。

WITH RECURSIVE cte (n) AS
(SELECT 1 FROM dual //没有使用cte,不参与递归UNION ALLSELECT n + 1 FROM cte WHERE n < 5//使用了cte,参与递归
)
SELECT * FROM cte;
//输出
+------+
| n    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
+------+

定义递归CTE的SQL可以由多个部分组成,中间用UNION ALL或UNION连接,没有使用cte的部分不参与递归,只执行一次,对于使用cte的部分递归执行,查询列n + 1其中的n使用的是上一次查询的结果,n < 5是递归停止的条件,这很重要,避免了无限循环。

下面是两个递归cte使用的例子:

WITH RECURSIVE cte AS
(SELECT 1 AS n, 1 AS p, -1 AS qUNION ALLSELECT n + 1, q * 2, p * 2 FROM cte WHERE n < 5
)
SELECT * FROM cte;
//输出
+------+------+------+
| n    | p    | q    |
+------+------+------+
|    1 |    1 |   -1 |
|    2 |   -2 |    2 |
|    3 |    4 |   -4 |
|    4 |   -8 |    8 |
|    5 |   16 |  -16 |
+------+------+------+//斐波那契数列生成
WITH RECURSIVE fibonacci (n, fib_n, next_fib_n) AS
(SELECT 1, 0, 1UNION ALLSELECT n + 1, next_fib_n, fib_n + next_fib_nFROM 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 |
+------+-------+------------+

数据库支持

主流的数据库都支持with as语句,如myql、oracle、db2、hive、sql server、MariaDB、PostgreSQL等数据库,有些数据库只有较高版本才支持,如mysql8以上、sql server 2005以后的版本、Oracle 9i之后的版本。

总结

总之with as语句是一个强大好用的工具,合理的使用不仅能方便我们写出复杂的SQL语句,还能提高查询效率、查询的可读性和维护性。with as的介绍就到这里,感谢阅读。

参考

MySQL 8.0 参考手册 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 线程知识点补充
  • 【Kubernetes】常见面试题汇总(二十九)
  • C++第1课——输出、变量和输入(含视频讲解)
  • MySQL深入原理
  • OpenCV特征检测(3)计算图像中每个像素处的特征值和特征向量函数cornerEigenValsAndVecs()的使用
  • 【ShuQiHere】深入理解布尔代数中的 SOP、POS、DNF 和 CNF
  • c# 线程等待变量的值符合条件
  • C++重生之我是001
  • 【django】局域网访问django启动的项目
  • [Java并发编程] synchronized(含与ReentrantLock的区别)
  • 常见的中间件漏洞
  • JVM 调优篇7 调优案例2-元空间的优化解决
  • 【什么是B/S、C/S架构】
  • 408算法题leetcode--第11天
  • nginx架构篇(三)
  • 30秒的PHP代码片段(1)数组 - Array
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • conda常用的命令
  • Create React App 使用
  • JavaScript设计模式与开发实践系列之策略模式
  • Java比较器对数组,集合排序
  • JDK 6和JDK 7中的substring()方法
  • JS 面试题总结
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • rabbitmq延迟消息示例
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Unix命令
  • Vim 折腾记
  • 飞驰在Mesos的涡轮引擎上
  • 回顾2016
  • 软件开发学习的5大技巧,你知道吗?
  • 消息队列系列二(IOT中消息队列的应用)
  • - 转 Ext2.0 form使用实例
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • ###STL(标准模板库)
  • #includecmath
  • (31)对象的克隆
  • (7)摄像机和云台
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (力扣)1314.矩阵区域和
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (南京观海微电子)——I3C协议介绍
  • (四)React组件、useState、组件样式
  • (一)80c52学习之旅-起始篇
  • (原创)可支持最大高度的NestedScrollView
  • ****Linux下Mysql的安装和配置
  • .NET Core WebAPI中封装Swagger配置
  • .NET Core引入性能分析引导优化
  • .Net 执行Linux下多行shell命令方法
  • .NET开发不可不知、不可不用的辅助类(一)