MySQL CTE 通用表表达式:基础学习

MySQL CTE 通用表表达式:基础学习

CTE(Common Table Expressions),是一个可以在单个语句范围内被创建的临时结果集,可在该语句中被多次引用。

使用基础

CTE通常以 WITH 关键字开头,后跟一个或多个子句,以逗号分隔。每个子句都提供一个结果集。

具体请看以下示例:

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

在这个语句中,两个结果集分别被命名为cte1,cte2,并在后续的SELECT查询中使用了它们。

结果集不仅能在SELECT查询中被引用,也可以被其他CTE语句引用,从而可以使CTE能够基于其他CTE进行定义。

CTE也可以引用自身来定义递归 CTE。递归 CTE 的常见应用包括分层或树结构数据的系列生成和遍历。

CTE语法结构

CTE 是 DML 语句语法的可选部分。它们是使用 WITH 子句定义:

with_clause:WITH [RECURSIVE]cte_name [(col_name [, col_name] ...)] AS (subquery)[, cte_name [(col_name [, col_name] ...)] AS (subquery)] ...
  • cte_name 表示单个通用表表达式的名字,可以被当作一个临时表被引用。
  • (subquery) 部分是生成CTE结果集的子查询部分,括号是必需的。
  • 如果CTE的子查询引用其自己的名称,则该CTE表达式是递归的。那么必须包含RECURSIVE关键字。

CTE结果集临时表的列名,即 [(col_name [, col_name] ...)] 部分,遵从以下原则:

  • 如果cte_name后面是带括号的名称列表,即明确指定了列名,如下:
WITH cte (col1, col2) AS
(SELECT 1, 2UNION ALLSELECT 3, 4
)
SELECT col1, col2 FROM cte;

那么,子查询的结果集返回列数比如和括号中的列个数相同。

  • 否则,cte临时表的列默认来自于子查询的结果集。
WITH cte AS
(SELECT 1 AS col1, 2 AS col2UNION ALLSELECT 3, 4
)
SELECT col1, col2 FROM cte;

WITH 适用于哪些上下文场景?

  • SELECT, UPDATE, 以及 DELETE 等语句的开头使用:
WITH ... SELECT ...
WITH ... UPDATE ...
WITH ... DELETE ...
  • 在子查询的开头使用(包括派生表子查询):
SELECT ... WHERE id IN (WITH ... SELECT ...) ...
SELECT * FROM (WITH ... SELECT ...) AS dt ...
  • 在包含 SELECT 语句的语句中,紧接在 SELECT 之前使用:
INSERT ... WITH ... SELECT ...
REPLACE ... WITH ... SELECT ...
CREATE TABLE ... WITH ... SELECT ...
CREATE VIEW ... WITH ... SELECT ...
DECLARE CURSOR ... WITH ... SELECT ...
EXPLAIN ... WITH ... SELECT ...

同一级别只允许一个 WITH 子句。不能在同一级别后跟另一个 WITH,因此以下语句是不合法的:

WITH cte1 AS (...) WITH cte2 AS (...) SELECT ...

要使语句合法,使用一个 WITH 子句,并用逗号分隔子句:

WITH cte1 AS (...), cte2 AS (...) SELECT ...

然而,如果它们出现在不同级别,则一个语句可以包含多个 WITH 子句:

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

一个 WITH 子句可以定义一个或多个通用表表达式,但每个CTE名称必须对该子句是唯一的。以下是不合法的:

WITH cte1 AS (...), cte1 AS (...) SELECT ...

为了使语句合法,用唯一名称定义CTEs:

WITH cte1 AS (...), cte2 AS (...) SELECT ...

相互引用

一个CTE可以在其自身或者其他CTE中被引用。

  • 引用自身的CTE是递归CTE。

  • 一个CTE中被引用的其他CTE需要在其前被定义。

    该约束排除了相互递归的CTE,cte1引用cte2,cte2引用cte1。其中一个引用必须是稍后定义的CTE,这是不允许的。

  • 在给定查询块中的CTE可以引用在更外层级别的查询块中定义的CTE,但不能引用在更内层级别的查询块中定义的CTE。

对于具有相同名称的对象的引用解析,派生表隐藏CTE;而CTE隐藏基本表、临时表和视图。名称解析是通过在同一查询块中搜索对象,然后逐个到更外层块中进行,直到找到该名称的对象为止。

递归通用表表达式

请参考文章:MySQL CTEs通用表表达式:进阶学习-递归通用表表达式
https://blog.csdn.net/kaka_buka/article/details/136512460

参考链接

  • 官方文档
    https://dev.mysql.com/doc/refman/8.0/en/with.html

  • 博客文章
    https://blog.csdn.net/w13966597931/article/details/133221384
    https://blog.csdn.net/a2272062968/article/details/131888595

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/725535.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【VTKExamples::PolyData】第四十九期 Silhouette

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例Silhouette,并解析接口vtkPolyDataSilhouette,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. Silhouett…

RocketMQ架构详解

文章目录 概述RocketMQ架构Broker 高可用集群刷盘策略 概述 RocketMQ一个纯java、分布式、队列模型的开源消息中间件,前身是MetaQ,是阿里研发的一个队列模型的消息中间件,后开源给apache基金会成为了apache的顶级开源项目,具有高…

QT计算两个日期之间的月份数

数据库中单表数据存储量过大时,会造成数据库的查询统计速度变慢,因此需将单表数据拆分存储到按年月命名的多张数据表中。解决思路是获取单表中的最小时间和最大时间,然后计算两个时间中的月份数量,最后根据开始年月循环算出所有需…

Spring事务管理

一、事务的基本概念 事务是一系列的操作,它们要么全部完成,要么全部不完成,是一个不可分割的工作单位。事务的处理必须满足其四个基本特性,即原子性(Atomicity)、一致性(Consistency&#xff0…

软件测试的基本概念

目录 1.测试需求 2.测试用例的概念 3.bug 4.软件生命周期 4.1需求分析 4.2计划 4.3编码 4.4测试 4.5运行维护 5.测试模型 5.1敏捷开发模型 5.2scrume 5.3测试模型 5.4w模型(双v模型) 6.软件测试的生命周期 7.BUG的描述和定义 8.如何定义bug的级别 9.BUG的…

机器学习——线性回归

机器学习——线性回归 文章目录 机器学习——线性回归一、什么是线性回归二、一元线性回归方程三、损失函数四、代码实现五、运用说明 一、什么是线性回归 线性回归是一种用来建立自变量和因变量之间线性关系的统计分析方法,也是机器学习中最常见、最容易理解的一个…

Java面试篇【RabbitMQ】常见面试题(2024最新)

RabbitMQ 1.为什么使用MQ?优点是什么 因为MQ可以异步处理,提高系统吞吐量。 应用解耦,系统之间可以通过消息通信,不关心其他系统的处理。 流量削峰,可以通过消息队列的长度,控制请求量。可以缓解短时间内的高并发请…

无线电信号及其分类

有线与无线通信 通信:指信息的交流与传递。 有线通信:用导向性传输媒体,即信息流沿着固体媒体传播。 例如电报、座机都是沿导线传送信号。 无线通信:用非导向性传输媒体,即在自由空间中被传播。分为红外线、电磁波等…

TCP/IP超全笔记 - TCP篇

TCP/IP超全笔记 - TCP篇 什么是 TCP TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。 面向连接:一对一,先连接,再传输数据可靠交付:…

openGauss gsql 常用元命令 一

openGauss gsql 常用元命令 一 连接数据库 使用 -E 参数可以显示元命令具体执行的 SQL 信息 [ommog1 ~]$ gsql -d postgres -p15400 -E gsql ((openGauss 2.1.0 build 590b0f8e) compiled at 2021-09-30 14:29:04 commit 0 last mr ) Non-SSL connection (SSL connection is…

【Mysql】InnoDB 中的聚簇索引、二级索引、联合索引

一、聚簇索引 其实之前内容中介绍的 B 树就是聚簇索引。 这种索引不需要我们显示地使用 INDEX 语句去创建,InnoDB 引擎会自动创建。另外,在 InnoDB 引擎中,聚簇索引就是数据的存储方式。 它有 2 个特点: 特点 1 使用记录主键…

HTTPS安全机制解析:如何保护我们的数据传输

引言 在数字时代,网络安全成为了互联网用户和服务提供者不可忽视的关键议题。特别是,HTTPS(全称为HyperText Transfer Protocol Secure)相比于其前身HTTP(HyperText Transfer Protocol),通过引…

如何恢复已删除的华为手机图片?5 种方式分享

不幸的现实是,华为的珍贵时刻有时会因为意外删除、软件故障或其他不可预见的情况而在眨眼之间消失。在这种情况下,寻求恢复已删除的图片成为个人迫切关心的问题。 本文旨在为用户提供如何从华为恢复已删除图片的实用解决方案。我们将探索五种可行的方法…

6-1 判回文

作者 唐艳琴 单位 中国人民解放军陆军工程大学 本题要求实现一个函数,判断字符串是否是回文。如果是则返回1,否则返回0。 函数接口定义: int isecho(char a[]);返回值为1,表示是回文;返回值为0,表示不是…

光线追踪5- Surface normals and multiple objects

首先,让我们获取一个表面法线,以便进行着色。这是一个垂直于交点处表面的向量。在我们的代码中,我们需要做一个重要的设计决定:法线向量是否为任意长度,还是将其归一化为单位长度。 诱人的是,如果不…

视频远程监控平台EasyCVR集成后播放只有一帧画面的原因排查与解决

智慧安防视频监控平台EasyCVR能在复杂的网络环境中(专网、局域网、广域网、VPN、公网等)将前端海量的设备进行统一集中接入与视频汇聚管理,平台可支持的接入协议包括:国标GB28181、RTSP/Onvif、RTMP,以及厂家的私有协议…

【STM32下UART协议的一些认识与使用方法】

STM32下UART协议的一些认识与使用方法 串口定义通用串行异步收发器 协议中相关的概念空闲位起始位数据位奇偶校验位三种校验方式BT接收数据的流程 停止位波特率总结 UART的三种工作方式UART控制器发送数据流程接收数据流程 UART初始化UART相关结构体和库函数 串口定义 通用串行…

揭秘共享旅游卡项目变现的6种方式,至少有4种适合创业者!

最近每天都有不少的朋友添加我,多数人会问一个问题,共享旅游卡这个项目好不好做?还有部分朋友会问,共享旅游卡有没有市场,是不是有我们所宣传的这样乐观? 从过年前开始,我一直在关注咱们共享旅…

自然语言处理之语言模型(LM)深度解析

自然语言处理(Natural Language Processing,NLP)作为人工智能的一个重要分支,近年来在学术界和工业界均取得了显著的进展。语言模型(Language Model, LM)是自然语言处理技术中的基石,它能够预测…

云计算 3月6号 (crontab-计划任务 日志轮转 免密登录)

一、计划任务 计划任务概念解析 在Linux操作系统中,除了用户即时执行的命令操作以外,还可以配置在指定的时间、指定的日期执行预先计划好的系统管理任务(如定期备份、定期采集监测数据)。RHEL6系统中默认已安装了at、crontab软件…