MySQL—CTE(十五)

一、CTE

概念:

MySQL的CTE是在MySQL8.0版本开始支持的,公用表表达式是一个命名的临时结果集,仅在单个SQL语句(例如select、insert、delete和update)的执行范围内存在
意义:

1> MySQL8.0之前,进行复杂查询时需要使用子查询来实现,SQL语句不仅语句复杂性能低,而且不够清晰。CTE的出现简化了复杂查询语句的编写,提高了SQL性能。

2> 与子查询或者派生查询相比,CTE可以重用上次的查询结果即查询一次即可,同时,CTE可以相互引用。例如:

WITH

d1 AS (SELECT ... FROM ...),

d2 AS (SELECT ... FROM d1 ... )

SELECT * FROM d1, d2 ...
语法:

WITH cte_name (column_list) AS (

cte_query

)

SELECT * FROM cte_name;
说明:
cte_name: 必填。CTE的名称,不能与当前with子句中的其他CTE的名称相同。
column_list: 可选。查询中的列数必须与column_list中的列数相同。 如果省略column_list,将使用cte中查询语句中使用的列。
**cte_query:**必填。一个select语句。select的结果集用于填充CTE。

**注意:**多个cte查询语句之间用逗号分隔。

二、举例分析

原来写法:

sql 复制代码
-- 原来写法:
select * 
from (
			select a.key, b.value
			from (select * from src where key is not null  ) a
			join (select * from src2 where value > 0  ) b
			on a.key = b.key
		 ) T1
union all
select *
from (
			select a.key, c.value
			from (select * from src where key is not null ) a
			left outer join (select * from src3 where value > 0 ) c
			on a.key = c.key and c.key is not null
		 )T2;

顶层的union两侧各为一个join,join的左表是相同的查询语句。通过写子查询的方式,只能重复这段代码。使用CTE的方式重写以上语句,命令示例如下:

sql 复制代码
with 
		a as (select * from src where key is not null),
		b as (select  * from src2 where value > 0),
		c as (select * from src3 where value > 0),
		T1 as (select a.key, b.value from a join b on a.key=b.key),
		T2 as (select a.key,c.value from a left outer join c on a.key=c.key and c.key is not null)
select * from T1 union all select * from T2;

小小举例:

sql 复制代码
-- 测试CTE
WITH aa AS(
SELECT *
FROM stu_score
)

SELECT * FROM aa;
相关推荐
0xDevNull11 分钟前
MySQL数据冷热分离详解
后端·mysql
科技小花27 分钟前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸28 分钟前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain30 分钟前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希1 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神1 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员1 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java2 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿2 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴2 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存