WITH(公共表表达式)

公共表表达式(common table expression,CTE)是一个命名的暂且效果集,存在于单个语句的范围内,界说后可以在该语句中引用它,可能多次引用。下面的讨论形貌若何编写使用 CTE 的语句。

通用表表达式

若要指定公共表表达式,请使用用逗号分开子语句的 WITH 子句。每个子句提供一个子查询,该子查询天生一个效果集,每个子查询关联一个名称。以下示例在 WITH 子句中界说名为 cte1 和 cte2 的 CTE,并在 WITH 子句后面的顶级 SELECT 中引用它们:

1. WITH
2.   cte1 AS (SELECT a, b FROM table1),
3.   cte2 AS (SELECT c, d FROM table2)
4. SELECT b, d FROM cte1 JOIN cte2
5. WHERE cte1.a = cte2.c;

在包罗 WITH 子句的语句中,可以引用每个 CTE 名称来访问响应的 CTE 效果集。

一个 CTE 名称可以在其他 CTE 中引用,从而可以基于其他 CTE 界说 CTE。

CTE 可以引用自身来界说递归 CTE。递归 CTE 的常见应用包罗序列天生和条理或树结构数据的遍历。

公共表表达式是 DML 语句语法的可选部门。它们是使用 WITH 子句界说的:

1. with_clause:
2.     WITH [RECURSIVE]
3.         cte_name [(col_name [, col_name] ...)] AS (subquery)
4.         [, cte_name [(col_name [, col_name] ...)] AS (subquery)] ...

cte_name 命名一个公共表表达式,可以在包罗 WITH 子句的语句中用作表引用。

AS (subquery) 的 subquery 部门称为“CTE 子查询”,它天生 CTE 效果集。AS 后面的括号是必须的。

若是公共表表达式的子查询引用它自己的名称,则该表达式是递归的。若是 WITH 子句中的任何 CTE 是递归的,则必须包罗 RECURSIVE 关键字。

明确给定 CTE 的列名如下:

● 若是圆括号括起来的列表名称跟在 CTE 名称后面,则这些名称就是列名称:

1. WITH cte (col1, col2) AS
2. (
3.   SELECT 1, 2
4.   UNION ALL
5.   SELECT 3, 4
6. )
7. SELECT col1, col2 FROM cte;

列表中的名称数目必须与效果集中的列数相同。

● 否则,列名来自 AS (subquery) 部门的第一个 SELECT 的选择列表:

1. WITH cte AS
2. (
3.   SELECT 1 AS col1, 2 AS col2
4.   UNION ALL
5.   SELECT 3, 4
6. )
7. SELECT col1, col2 FROM cte;

在以下上下文中允许使用 WITH 子句:

● 在 SELECT、UPDATE 和 DELETE 语句的开头。

,

以太坊高度数据

www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。

,
1. WITH ... SELECT ...
2. WITH ... UPDATE ...
3. WITH ... DELETE ...

● 在子查询(包罗派生表子查询)最先部门:

1.SELECT ... WHERE id IN (WITH ... SELECT ...) ...
2.SELECT * FROM (WITH ... SELECT ...) AS dt ...

● 紧跟在包罗 SELECT 语句的 SELECT 语句之前:

1. INSERT ... WITH ... SELECT ...
2. REPLACE ... WITH ... SELECT ...
3. CREATE TABLE ... WITH ... SELECT ...
4. CREATE VIEW ... WITH ... SELECT ...
5. DECLARE CURSOR ... WITH ... SELECT ...
6. EXPLAIN ... WITH ... SELECT ...

统一级别只允许有一个 WITH 子句。统一级其余 WITH 后面跟 WITH 是不允许的,因此以下语句是非法的:

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

要使语句正当,请使用一个 WITH 子句,用逗号分开它的子句:

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

但若是出现在差别的层级,一个语句可以包罗多个WITH子句:

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

WITH 子句可以界说一个或多个公共表表达式,但每个 CTE 名称对于该子句必须是唯一的。以下语句是非法的:

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

要使语句正当,请使用唯一名称界说 CTE:

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

CTE 可以指自身或其他 CTE:

● 自引用 CTE 是递归的。

● CTE 可以引用在统一 WITH 子句中前面界说的 CTE,但不能引用后面界说的 CTE。

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

● 给定查询块中的 CTE 可以引用在更外部层级的查询块中界说的 CTE,但不能引用在更内部层级的查询块中界说的 CTE。

为了剖析对同名工具的引用,派生表隐藏 CTE;而 CTE 隐藏基本表、暂且表和视图。名称剖析的方式是在统一个查询块中搜索工具,若是找不到具有该名称的工具依次转到外部查询块。

与派生表一样,MySQL 8.0.14 之前 CTE 不能包罗外部引用。这是 MySQL 8.0.14 中作废的 MySQL 限制,而不是 SQL 尺度的限制。

官方网址:
https://dev.mysql.com/doc/refman/8.0/en/with.html