公共表表达式(CTE)是 SQL 中的一个临时结果集,我们可以在 SELECT、INSERT、UPDATE 或 DELETE 语句中引用它。
CTE 使复杂查询更具可读性和可维护性。
示例
WITH RecentCustomers AS (
SELECT * FROM Customers WHERE age < 30
)
SELECT * FROM RecentCustomers;
这里,CTE RecentCustomers
从 Customers 表中选择年龄小于 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
连接 Customers 和 Orders 表,并显示 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。