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;
相关推荐
倔强的石头_9 小时前
《Kingbase护城河》——猎捕慢查询:执行计划的微观解析与索引调优实战
数据库
SelectDB11 小时前
Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑
大数据·数据库·python
jiayou642 天前
KingbaseES 表级与列级加密完全指南
数据库·后端
GBASE2 天前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
xiezhr3 天前
逛GitHub发现了一款免费的带AI功能的数据库管理工具
数据库·ai编程·dba
唐青枫4 天前
MySQL JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
sql·mysql
吃糖的小孩4 天前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
小满8784 天前
5.Mysql事务隔离级别与锁机制
mysql
笃行3505 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3505 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库