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

本文介绍了CTE(公共表表达式)的概念及其在SQL查询中的应用。CTE是一种临时结果集,可以提高查询的可读性和性能。文章通过示例展示了如何使用CTE简化复杂的SQL查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,咱们来看下什么是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的数据。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luyaran

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值