第4章 从行到组:聚合函数、GROUP BY 与 HAVING


第4章 · 从行到组:聚合与分组

本章要回答的三个问题:COUNT、SUM、AVG 这些聚合函数把多行折叠成一个数,折叠时 NULL 是被算进去还是被跳过?GROUP BY 按什么折叠、为什么 SELECT 里出现"分组列之外"的列会直接报错?分组之后还想再筛选,为什么 WHERE 无能为力、必须换 HAVING?本章是 SQL 思维的第一次跃迁:从"看行"到"看组"。

为什么会有这一章

业务提问的方式变了。"库存总量多少""每个分类平均定价多少""哪些分类的书超过三种"——这些问题没有一行数据能直接回答,它们问的是一堆行的共同属性。聚合函数负责"算这一堆",GROUP BY 负责"划定哪一堆",HAVING 负责"把不达标的一堆扔掉"。三件套合起来,你才能从明细数据里产出报表。

这一章也是整个阶梯上承前启后的枢纽。向前看,第 3 章的表达式与 CASE 会在聚合里大显身手(条件计数、条件求和);向后看,GROUP BY 折叠明细行这个"天性",恰好是第 7 章窗口函数登场的理由——想要"每组汇总值 + 每行明细"同屏显示,GROUP BY 做不到,窗口函数做得到。理解了 GROUP BY 的局限,才算真正理解窗口函数存在的意义。

读完能解决什么

  • 说出 COUNT(*)、COUNT(列)、COUNT(DISTINCT 列) 三者的差别与各自数的是什么;
  • 解释 SUM、AVG、MIN、MAX 对 NULL 的处理方式,以及 AVG 分母为什么常和直觉不同;
  • 写出正确的 GROUP BY 查询,并解释"SELECT 只能出现分组列与聚合表达式"背后的逻辑;
  • 读懂常见报错"选择列表中的列无效"的真正含义并改正;
  • 用 HAVING 对聚合结果设条件,并说清它与 WHERE 的分工——一个筛行、一个筛组。

各节怎么分工

节 回答哪个问题 关键产出
4.1 聚合函数与 COUNT 的三种数法 折叠时怎么算 五大聚合函数、NULL 处理规则、DISTINCT 的位置
4.2 GROUP BY 与 HAVING 按什么折叠、折后怎么筛 分组机制、SELECT 列限制、WHERE/HAVING 流水线

先决条件

  • 第 1 章的逻辑执行顺序(本章会把流水线扩展成七步);
  • 第 3 章的 CASE 条件聚合惯用法会在 4.1 的综合案例中复用。

本章知识点清单

  • 能写出五个聚合函数的最小示例,并各说一个使用前提;
  • 能推断含 NULL 列上 COUNT(列) 与 COUNT(*) 的差值等于什么;
  • 能解释 AVG(列) 等价于 SUM(列) 除以 COUNT(列) 而非 COUNT(*);
  • 能说出 GROUP BY 多列分组时"组"的定义;
  • 能改正"SELECT 出现非分组列"的报错语句;
  • 能写出 WHERE 与 HAVING 并存的查询并解释两者执行先后;
  • 能用 HAVING COUNT(*) 过滤小样本组(如剔除订单数少于三的顾客)。

本章概念全景

聚合的本质是"牺牲明细换洞察":每组只剩一个数,行没了。记住这笔交易的代价,第 7 章你会看到不用付这笔账的另一种聚合。

往下走到哪

单表之内能查能算能分组,但书店的数据散在七张表里:书名在 books、买家在 customers、订单在 orders。下一章走出单表,用 JOIN 把拆开的世界拼回来——先回答"当初为什么要拆"。

作者与出处
原作者:灏天文库
来源:平台策划编纂
整理人: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U