MySQL 8.0之CTE(使用CTE(公共表表达式)来构建复杂查询)

  • Post author:
  • Post category:mysql




首先,咱们来看下什么是CTE(公共表表达式)?其实,公用表表达式是一个命名的临时结果集,仅在单个SQL语句(例如SELECT,INSERT,UPDATE或DELETE)的执行范围内存在。与派生表类似,

CTE

不作为对象存储,仅在查询执行期间持续。 与派生表不同,

CTE

可以是自引用(递归CTE,也可以在同一查询中多次引用。 此外,与派生表相比,

CTE

提供了更好的可读性和性能。

CTE

的结构包括名称,可选列列表和定义

CTE

的查询。 定义

CTE

后,可以像

SELECT



INSERT



UPDATE



DELETE



CREATE VIEW

语句中的视图一样使用它。我们来看下

CTE

的基本语法:

WITH cte_name (column_list) AS (
    query
) 
SELECT * FROM cte_name;



我们要注意的是查询中的列数必须与

column_list

中的列数相同。 如果省略

column_list



CTE

将使用定义

CTE

的查询的列列表。同时嘞,为了大家更容易地了解

CTE

概念,咱们通过查询

customers

表中的数据,来做个实例:

WITH customers_in_usa AS (
    SELECT 
        customerName, state
    FROM
        customers
    WHERE
        country = 'USA'
) SELECT 
    customerName
 FROM
    customers_in_usa
 WHERE
    state = 'CA'
 ORDER BY customerName;



咱们来看下部分结果集:








在上面的例子中,CTE

的名称为

customers_in_usa

,定义

CTE

的查询返回两列:

customerName



state

。因此,

customers_in_usa


CTE

返回位于美国的所有客户。大概感觉有点意思了吧,嘿嘿。咱们再来看个复杂一点的例子,来看下面的sql:

WITH salesrep AS (
    SELECT 
        employeeNumber,
        CONCAT(firstName, ' ', lastName) AS salesrepName
    FROM
        employees
    WHERE
        jobTitle = 'Sales Rep'
),
customer_salesrep AS (
    SELECT 
        customerName, salesrepName
    FROM
        customers
            INNER JOIN
        salesrep ON employeeNumber = salesrepEmployeeNumber
)
SELECT 
    *
FROM
    customer_salesrep
ORDER BY customerName;



执行上面查询语句,得到以下结果:







在上面的sql询中有两个

CTE

。 第一个CTE(

salesrep

)获得职位是销售代表的员工。 第二个CTE(

customer_salesrep

)使用

INNER JOIN

子句与第一个

CTE

连接来获取每个销售代表负责的客户。在使用第二个

CTE

之后,使用带有order by子句的简单

SELECT

语句来查询来自该

CTE

的数据。



大概有点印象了吧,嘿嘿。咱们这次就到这里了,说多了怕懵,如果感觉不错的话,请多多点赞支持哦。。。




版权声明:本文为luyaran原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。