集函数和分组查询的执行逻辑顺序

理解 SQL 中 集函数(聚合函数) 和 分组查询(GROUP BY) 的执行顺序确实容易混淆,但通过拆解 SQL 语句的逻辑流程会清晰很多。以下是关键步骤的详细解释:


1. 核心执行顺序(逻辑上的)

SQL 语句的执行顺序 并非 书写顺序,而是按以下逻辑处理:

sql

复制

下载

SELECT 聚合函数(字段)  -- 5. 对分组后的结果计算聚合函数
FROM 表名             -- 1. 先定位数据来源
WHERE 条件            -- 2. 筛选原始数据(在分组前)
GROUP BY 分组字段      -- 3. 按指定字段分组
HAVING 条件           -- 4. 筛选分组后的结果
ORDER BY 排序字段      -- 6. 对最终结果排序

2. 分步详解(以例子说明)

假设有一张 sales 表:

productcategoryamount
AX100
BY200
AX150

查询示例:

sql

复制

下载

SELECT 
    category, 
    SUM(amount) AS total_amount  -- 计算每个分组的金额总和
FROM 
    sales
WHERE 
    amount > 100                -- 先过滤掉 amount ≤ 100 的行
GROUP BY 
    category                    -- 按 category 分组
HAVING 
    SUM(amount) > 200           -- 只保留总和 > 200 的分组
ORDER BY 
    total_amount DESC;          -- 按总金额降序

执行步骤:

  1. FROM:定位到 sales 表。

  2. WHERE:过滤原始数据,排除 amount ≤ 100 的行(删除第一行 A, X, 100)。

    • 剩余数据:

      productcategoryamount
      BY200
      AX150
  3. GROUP BY:按 category 分组:

    • 分组结果:

      • 组 X[A, X, 150]

      • 组 Y[B, Y, 200]

  4. HAVING:筛选分组后的结果,排除 SUM(amount) ≤ 200 的组(删除组 X)。

    • 剩余分组:Y

  5. SELECT:计算每个分组的 SUM(amount)

    • 结果:

      categorytotal_amount
      Y200
  6. ORDER BY:按 total_amount DESC 排序(本例只有一行,无变化)。


3. 关键区别与易错点

  • WHERE vs HAVING

    • WHERE 在分组前过滤 原始数据行

    • HAVING 在分组后过滤 分组结果(必须配合 GROUP BY 使用)。

  • 聚合函数的作用域

    • 在 SELECT 或 HAVING 中可直接使用(如 SUM(amount))。

    • 在 WHERE 中 不能 直接使用聚合函数(因为此时还未分组)。

错误示例:

sql

复制

下载

-- 错误!WHERE 中不能直接使用聚合函数
SELECT category, SUM(amount)
FROM sales
WHERE SUM(amount) > 100;  -- 报错!

4. 特殊场景

  • 没有 GROUP BY 时:整张表视为一个分组,聚合函数计算全局值。

    sql

    复制

    下载

    SELECT SUM(amount) FROM sales;  -- 返回所有 amount 的总和
  • SELECT 中的非聚合字段:必须出现在 GROUP BY 中,否则会报错。

    sql

    复制

    下载

    -- 错误!product 未在 GROUP BY 中
    SELECT product, SUM(amount)
    FROM sales
    GROUP BY category;

5. 可视化流程图

复制

下载

原始表 → WHERE 过滤 → GROUP BY 分组 → HAVING 过滤 → SELECT 计算聚合 → ORDER BY 排序 → 结果

通过这种分步拆解,可以清晰理解集函数和分组查询是如何协同工作的。多练习实际例子会更容易掌握!

喵,终于明白了。

喵~太好了!(≧▽≦) 你能明白我真的超开心!

其实 SQL 的执行顺序就像做菜一样:
1️⃣ 先选食材(FROM + WHERE)→
2️⃣ 按菜谱分组处理(GROUP BY)→
3️⃣ 挑出好吃的部分(HAVING)→
4️⃣ 最后摆盘(SELECT + ORDER BY)

你第一次遇到分组查询时是不是也这样?
👉 "为什么 WHERE 里不能直接用 SUM()?急得挠屏幕!"(╯‵□′)╯︵┻━┻
(我懂!数据库引擎这时候会冷漠脸:"朕还没分组呢,你让朕怎么聚合?"

小测验巩固一下
如果执行这个会发生什么?

sql

复制

下载

SELECT category, AVG(amount)  
FROM sales  
WHERE AVG(amount) > 150  -- 这里故意写错!
GROUP BY category;

正确答案:🐾 会报错!因为 WHERE 不能调戏聚合函数~

下次遇到复杂查询时,记得画出执行顺序流程图哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值