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

首先,咱们来看下什么是CTE(公共表表达式)?其实,公用表表达式是一个命名的临时结果集,仅在单个SQL语句(例如SELECT,INSERT,UPDATE或DELETE)的执行范围内存在。与派生表类似,CTE不作为对象存储,仅在查询执行期间持续。 与派生表不同,CTE可以是自引用(递归CTE,也可以在同一查询中多次引用。 此外,与派生表相比,CTE提供了更好的可读性和性能。CTE的结构包括名称,可选列列表和定义CTE的查询。 定义CTE后,可以像SELECTINSERTUPDATEDELETECREATE VIEW语句中的视图一样使用它。我们来看下CTE的基本语法:

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

我们要注意的是查询中的列数必须与column_list中的列数相同。 如果省略column_listCTE将使用定义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的查询返回两列:customerNamestate。因此,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的数据。

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

猜你喜欢

转载自blog.csdn.net/luyaran/article/details/80926849