模块 14 · 第 1 课(共 3)课程中的53/57~12 min
模块课程(1/3)
CTE 简介 (WITH)
CTE 简介 (WITH)
每个人迟早都会遇到这种情况:您需要根据聚合结果过滤数据,然后采用该过滤器并将其与另一个聚合查询连接起来。您开始在 SELECT 中写入 SELECT,而该 SELECT 又最终在另一个 SELECT 的 FROM 中。
结果呢? Spaghetti SQL,任何人都无法理解的查询。
CTE(通用表表达式)可让您理清这一混乱局面。您可以使用 WITH 关键字激活它们,这允许您定义临时命名查询,然后在最终查询中将它们重用为“虚拟表”。
基本语法
SQL
WITH premium_customers AS (
SELECT customer_id, SUM(total_amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(total_amount) > 1000
)
SELECT customers.first_name, premium_customers.total_spent
FROM customers
JOIN premium_customers ON customers.id = premium_customers.customer_id;正如您所看到的,底部的主查询从 premium_customers 读取,就像它是一个真正的表一样!而且它比带有嵌套子查询的大型内部联接更具可读性。
锻炼#sql.m14.l1.e1
尝试:0加载中...
我们想要非常昂贵的产品。使用名为“luxury_products”的 CTE 从“products”中选择“id”和“price”,其中“price > 500”。然后在此 CTE 上运行主查询并显示所有内容 (*)。
正在加载编辑器...
显示提示
从WITH Luxury_products AS (...)开始,然后SELECT * FROM Luxury_products。
3 次尝试后可用的解决方案
锻炼#sql.m14.l1.e2
尝试:0加载中...
我们希望找到撰写评论的用户。创建一个 CTE“评论者”,从“评论”中提取唯一 (DISTINCT)“customer_id”值。然后从“customers”表中提取“id”、“first_name”、“last_name”,并将其与 id 上的“reviewers”CTE“JOIN”。
正在加载编辑器...
显示提示
与评论者AS(从评论中选择不同的客户ID)从客户中选择ID,名字,姓氏加入评论者ONcustomers.id = reviewers.customer_id;
3 次尝试后可用的解决方案