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;
相关推荐
岁岁种桃花儿4 小时前
MySQL从入门到精通系列:InnoDB记录存储结构
数据库·mysql
jiunian_cn5 小时前
【Redis】hash数据类型相关指令
数据库·redis·哈希算法
冉冰学姐5 小时前
SSM在线影评网站平台82ap4(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm框架·在线影评平台·影片分类
Exquisite.6 小时前
企业高性能web服务器(4)
运维·服务器·前端·网络·mysql
知识分享小能手6 小时前
SQL Server 2019入门学习教程,从入门到精通,SQL Server 2019数据库的操作(2)
数据库·学习·sqlserver
踩坑小念7 小时前
秒杀场景下如何处理redis扣除状态不一致问题
数据库·redis·分布式·缓存·秒杀
萧曵 丶8 小时前
MySQL 语句书写顺序与执行顺序对比速记表
数据库·mysql
Wiktok9 小时前
MySQL的常用数据类型
数据库·mysql
曹牧9 小时前
Oracle 表闪回(Flashback Table)
数据库·oracle
J_liaty9 小时前
Redis 超详细入门教程:从零基础到实战精通
数据库·redis·缓存