SQL CTE 从零到一:理解与实战

找出所有累计消费金额超过 10000 元的"高价值用户"

使用CTE查询高价值用户(消费>10000)

sql 语句如下

复制代码
WITH high_value_users AS (
​
    SELECT u.id, u.name, SUM(o.amount) AS total_spent
    FROM users u
    JOIN orders o ON u.id = o.user_id
    GROUP BY u.id
    HAVING total_spent > 10000
​
)
​
SELECT * FROM high_value_users;
​

如何理解这句sql呢?

这个 SQL 的作用是:

我将它拆成 3 层,一步步讲清楚。

第一步:先看最核心的查询(去掉 CTE)

复制代码
SELECT u.id, u.name, SUM(o.amount) AS total_spent
FROM users u
JOIN orders o ON u.id = o.user_id
GROUP BY u.id
HAVING SUM(o.amount) > 10000;

这段的意思是:

  • users 表和 orders 表通过 user_id 关联起来

  • u.id(每个用户)分组

  • 对每个用户的订单金额求和:SUM(o.amount)

  • HAVING 筛选出总和大于 10000 的用户

结果会得到一张表,列是:id, name, total_spent(比如张三消费了 15000 元)。

第二步:CTE 做了什么?

复制代码
WITH high_value_users AS (
    -- 上面那段查询放在这里
)

WITH ... AS ... 的作用是:给这段查询起一个临时名字 ,叫 high_value_users。 就像你在纸上先算出中间结果,给它取个名字,后面可以直接引用。

第三步:主查询使用这个临时表

复制代码
SELECT * FROM high_value_users;

就是从刚才那个临时表里取出所有列(id, name, total_spent)。

合起来完整逻辑

  1. 先计算每个用户的总消费金额,只保留 > 10000 的用户 → 结果放入 high_value_users

  2. 然后从 high_value_users 中显示所有数据

实际执行效果:输出所有高价值用户的 ID、姓名、总消费金额。


为什么用 CTE(而不是直接写查询)?

在这个简单例子中,直接用子查询或 HAVING 就够,但 CTE 的好处是:

  • 当后面需要多次使用这个"高价值用户"结果时(比如还要去关联其他表),不用重复写相同的聚合逻辑

  • 让 SQL 更易读:先定义"高价值用户是什么",再查询它


类比帮助你理解

你让助手先去仓库里把"价格超过 1 万元的商品"全部挑出来,放在一个临时货架上,并给这个货架贴上标签 "贵重商品"。 然后你命令:"把贵重商品清单打印出来"。

  • WITH 贵重商品 AS (挑货逻辑) → 定义临时货架

  • SELECT * FROM 贵重商品 → 打印清单

相关推荐
数智化管理手记19 分钟前
主数据重复、错漏频发?一站式主数据管理平台如何落地?
大数据·运维·数据库·人工智能·数据挖掘
吴声子夜歌23 分钟前
MongoDB 4.2——选择片键
数据库·mongodb
天天进步一点点1 小时前
QSqlQuery删除sqlite数据库执行drop数据表报错database table is locked unable to fetch row问题
数据库·oracle·sqlite
音视频工程实战1 小时前
PromptQL 新手入门与实战指南
数据库·sql·算法
清川渡水1 小时前
NL2SQL 的正确打开方式:从「AI 猜 SQL」到「置信度闭环」的工程化落地
数据库·人工智能·sql
TDengine (老段)2 小时前
TDengine Go 与 Rust 连接器 — 高性能异步访问
大数据·数据库·物联网·golang·rust·时序数据库·tdengine
东方佑2 小时前
MA-RMSNorm:打破“缩放换智能”的魔咒,大模型归一化的一次范式革命!
数据库·人工智能·计算机视觉
云和恩墨2 小时前
「云帆计划·长沙站」活动成功举办,云和恩墨与紫薇垣和湖南金悦科技分别签约并授牌,本地伙伴生态建设加速
数据库·科技
千维百策6663 小时前
如何管理错误预算:提升服务可靠性与 SLO 达成率的实践经验
服务器·网络·数据库
Y3815326624 小时前
2026 年 7 月,SERP API 调用的稳定性实战:超时、重试、降级
开发语言·数据库·人工智能·php