SQL CTE(公共表表达式)

公共表表达式(CTE)是 SQL 中的一个临时结果集,我们可以在 SELECTINSERTUPDATEDELETE 语句中引用它。

CTE 使复杂查询更具可读性和可维护性。

示例

WITH RecentCustomers AS (
    SELECT * FROM Customers WHERE age < 30
)
SELECT * FROM RecentCustomers;

这里,CTE RecentCustomersCustomers 表中选择年龄小于 30 岁的客户。


带 WHERE 子句的 CTE

CTE 可以与 WHERE 子句结合使用,以更结构化的方式过滤结果。例如,

WITH HighValueOrders AS (
    SELECT * FROM Orders
    WHERE amount > 1000
)
SELECT * FROM HighValueOrders
WHERE customer_id = 3;

这里,CTE HighValueOrders 选择了金额大于 1000 的订单。

然后,查询进一步过滤这些订单,只选择客户 ID 为 3 的订单。


将 CTE 与 JOIN 一起使用

CTE 可以有效地与 JOIN 一起使用,以简化跨多个表的复杂连接。

我们来看一个例子。

WITH CustomerOrders AS (
    SELECT C.customer_id, O.item
    FROM Customers C
    JOIN Orders O ON C.customer_id = O.customer_id
)
SELECT * FROM CustomerOrders;

在此示例中,CTE CustomerOrders 连接 CustomersOrders 表,并显示 Customers 表中的 customer_id 列和 Orders 表中的 item 列。

然后,查询从 CustomerOrders CTE 中选择所有列。


将 CTE 与 UPDATE 语句一起使用

CTE 还可以用于 UPDATE 语句中,用于根据复杂条件更新数据。例如,

WITH PendingShippings AS (
    SELECT * FROM Shippings
    WHERE status = 'Pending'
)
UPDATE Shippings
SET status = 'In Transit'
WHERE shipping_id IN (SELECT shipping_id FROM PendingShippings);

SELECT * FROM Shippings;

这里,CTE PendingShippings 选择了所有 status 值为 Pending 的货件。

然后,UPDATE 语句将这些货件更新为 In Transit

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战