CTE(Common Table Expression,通用表达式) 是在 SQL 查询中定义临时结果集的一种方法,它可以让查询更加简洁、可读性更高,并且可以重复引用。
CTE 是在WITH
关键字后面定义的一个子查询,可以在同一查询中被引用多次。它可以被认为是一个临时表,只在定义它的查询(例如:SELECT
、INSERT
、DELECT
、UPDATE
)中可见,并且这个临时表的生命周期仅限于当前查询,不作为对象被存储。
不同于派生表(Derived Table)CTE可以是自引用的(递归CTE),也可以在
同一查询中多次引用。此外,与派生表相比,CTE提供了更好的可读性和性能。
语法格式如下:
WITH cte_name [column_list] AS(
-- CTE query
SELECT column1,column2,...
FROM table_name
WHERE condition
...;
)
SELECT columnlist FROM cte_name;
-
CTE query 中的字段数必须与column_list的字段数相同,若省略column_list,CTE将会使用 CTE query 中的columns
-
还可以使用两个或以上CTE作为临时表进行查询
-
CTE 查询定义部分使用 SELECT 语句定义了结果集的内容,可以包含各种查询操作和条件。它的结果集将成为 CTE 的数据。
-
在主查询部分,可以引用 CTE 的名称来访问 CTE 查询部分定义的结果集。
CTE 优点
-
简化查询逻辑:CTE 允许在查询中使用递归、复杂的子查询或多个操作步骤,以更清晰、易读的方式组织查询逻辑。
-
重用和可读性:在同一个查询中多次引用 CTE,避免了重复的子查询,提高了查询的可读性和重用性。
-
性能优化:某些情况下,使用 CTE 可以帮助数据库管理系统进行优化,减少重复查询的开销。
WITH 关键字
WITH 是在 SQL 查询中使用的关键字,用于定义一个或多个通用表达式(Common Table Expression,CTE)。
WITH … INSERT…
在传统的 INSERT
语句中,需要分别指定目标表和要插入的值,而使用 WITH INSERT
技术,可以 先使用 WITH 子句定义一组数据,然后在 INSERT 语句中引用这个临时的数据集合进行插入。基本模式如下:
WITH cte_name [column_list] AS(
initial_query
[UNION