Mysql 简明教程

MySQL - Common Table Expression (WITH)

The MySQL Common Table Expression

MySQL 公共表表达式 (CTE) 是一个临时结果集或表,它存在于单个查询的持续时间内。我们可以使用 CTE 来引用单个 SELECT、UPDATE、INSERT、DELETE、CREATE、VIEW 或 MERGE 语句上下文中结果集。

CTE 的范围仅限于该特定查询。它通过将复杂查询分解为简单的块来简化复杂查询。

The MySQL WITH Clause

MySQL WITH 子句用于通过包含一个或多个逗号分隔的子句创建 CTE。子句提供一个子查询来生成结果集。

在 8.0 之前的 MySQL 版本中不能使用 WITH 子句。

Syntax

以下是 MySQL WITH 子句的语法 −

WITH name_for_summary_data AS (SELECT Statement)
SELECT columns
FROM name_for_summary_data
WHERE conditions <=> (
   SELECT column
   FROM name_for_summary_data
)
[ORDER BY columns]

Example

假设我们创建了一个名为 DATA 的表,其中包含 id、name、age 和 salary 等详细信息 −

CREATE TABLE DATA(
   ID INT,
   NAME CHAR(20),
   AGE INT,
   SALARY INT
);

现在,让我们使用 INSERT INTO 语句将值插入到上面创建的表中,如下所示 −

INSERT INTO DATA VALUES
(101, 'John', 25, 55452),
(102, 'Jane', 29, 66458),
(103, 'Arub', 35, 36944);

在以下示例中,WITH 子句用于创建一个名为 CTE 的 CTE,然后查询该 CTE 以从 DATA 表中检索数据 −

WITH CTE AS
(Select ID, NAME, AGE, SALARY FROM DATA)
SELECT * FROM CTE;

在执行上述代码后,我们如下获得输出 −

CTE from Multiple Tables

我们可以通过使用逗号 (',') 分隔每个 CTE 子句来从多张表创建 CTE。

Example

假设我们创建了一个名为 EMPLOYEE 的表,并将数据填充到其中,如下所示:

CREATE TABLE EMPLOYEE(
   ID INT NOT NULL,
   FIRST_NAME CHAR(20) NOT NULL,
   LAST_NAME CHAR(20),
   AGE INT,
   SEX CHAR(1),
   INCOME FLOAT,
   CONTACT INT
);

在此处,正在将记录插入 EMPLOYEE 表中 −

INSERT INTO EMPLOYEE VALUES
(101, 'Serena', 'Williams', 27, 'F', 9000, 101),
(102, 'Virat', 'Kohli', 20, 'M', 6000, 102);

获得的 EMPLOYEE 表如下 −

现在,创建一个名为 CONTACT 的其他表 −

CREATE TABLE CONTACT(
   ID INT NOT NULL,
   EMAIL CHAR(20) NOT NULL,
   PHONE LONG,
   CITY CHAR(20)
);

让我们在 CONTACT 表中插入一些记录 -

INSERT INTO CONTACT (ID, EMAIL, CITY) VALUES
(101, 'serena@mymail.com', 'Hyderabad'),
(102, 'virat@mymail.com', 'Vishakhapatnam');

生成的 CONTACT 表如下 -

以下示例使用名为“exp1”和“exp2”的公共表表达式 (CTE) 从 EMPLOYEE 和 CONTACT 表中分别选择特定列。最终的 SELECT 语句联接这些 CTE,组合每个 CTE 中选择列 -

WITH
exp1 AS (SELECT ID, FIRST_NAME, LAST_NAME FROM EMPLOYEE),
exp2 AS (SELECT EMAIL, PHONE FROM CONTACT)
SELECT * FROM exp1 JOIN exp2;

以下是上面代码的输出: -