📄 一句话概括
SUM 求一列总和、AVG 求一列平均——聚合函数收官;两者都自动忽略 NULL,平均值分母因此藏着惊喜。
📝 本节和前面几节的关系
聚合四件套的最后两件。AVG 是四件里最能暴露【NULL 脾气】的——钱七那一格空值,会让【平均分】的分母悄悄变 4。
一、两条命令
-- 准备块(没建表先跑 3-6 的准备块)
SELECT SUM(score) AS 总分 FROM students; -- 85+92+78+64 = 319
SELECT AVG(score) AS 平均分 FROM students; -- 319 / 4 = 79.75
看仔细:平均分是 79.75,不是 319 ÷ 5 = 63.8。
- SUM/AVG 只算有值的行(NULL 不参与求和,也不进分母)
- 5 人里 4 人有分 → 总和 319、平均 79.75
二、NULL 到底怎么算的:一张验算表
| 行 | score |
|---|---|
| 张三 | 85 |
| 李四 | 92 |
| 王五 | 78 |
| 赵六 | 64 |
| 钱七 | NULL(跳过) |
- SUM = 85+92+78+64 = 319(NULL 当不存在)
- AVG = 319 ÷ 4 = 79.75(分母是【有值的行数】,不是总行数)
- 想【按总人数算平均(缺考算 0 分)】?自己处理:
SUM(score) / COUNT(*)→ 319 ÷ 5 = 63.8——两种平均都有业务意义,看你要哪种
三、动手 Demo:四件套一锅端
-- 一句话把四个聚合全要了
SELECT COUNT(score) AS 有分人数,
MAX(score) AS 最高分,
MIN(score) AS 最低分,
AVG(score) AS 平均分
FROM students;
输出:
有分人数 最高分 最低分 平均分
4 92 64 79.75
看到什么算成功:一行四列、平均分 79.75——能自己验算出【分母是 4 不是 5】,本节就算过关。
四、30 秒实验
亲手对比两种平均:
SELECT AVG(score) AS 缺考不算 FROM students; -- 79.75
SELECT SUM(score) / COUNT(*) AS 缺考算零 FROM students; -- 63.8
——同一个班,两种【平均分】差出近 16 分。业务报表【平均销售额暴跌】有时只是【有人没填数】被 AVG 静默跳过——先问清 NULL 的口径再谈平均。
五、常见误区
- "AVG 的分母是总行数" —— 是有值的行数(NULL 不进分母);要按总人数平均得用 SUM/COUNT(*) 自己拼。
- "SUM 遇到 NULL 会报错" —— 不会,NULL 被静默跳过;但整列全空时 SUM 给 NULL、AVG 也给 NULL(连分母 0 都不给你,避免除零)。
- "聚合函数和普通列能随便混选" ——
SELECT name, AVG(score)与 3-16 的坑同款:不可靠。混选必须配合 GROUP BY(3-18)。
自测三问(点开对答案)
1. 本表 SUM 和 AVG 各是多少? **SUM=319,AVG=79.75(319 ÷ 4)**——NULL 不进分子也不进分母。 2. 【缺考按 0 分算的平均】怎么写? **`SUM(score) / COUNT(*)`**——分母换成总行数。 3. 整列全 NULL 时 SUM/AVG 返回什么? **NULL**(COUNT 对空给 0,态度不同)。- ☐ 下一节(3-18 GROUP BY-对记录进行分组)
相关笔记
- COUNT函数-获取记录的数量 —— 聚合第一发:NULL 的脾气从那节贯穿到这
- 🗄️ 数据库基础 · 索引 —— 全课路线图