# P17 17. 基础-SQL-DQL-聚合函数

> 本页是学习笔记，不等同于视频逐字稿。原声字幕未取得（匿名接口字幕轨为空且需登录，未使用任何账号），也没有逐句讲解记录；讲义只按节与页码对应，切点未逐句确证。

> 以同版讲义的公开镜像核对章节与页码（镜像非官方出品）；非逐字稿，示例为原创补充。

## P17 17. 基础-SQL-DQL-聚合函数

- 原视频：https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=17（p=17），时长 6:39
- 讲义：2.6.4 聚合函数 p45–46（公开镜像；按主题对应，切点 notexact）

- 本集练习数据：practice/p17.sql（先执行，再对照小例）

### 一句话理解

聚合函数把多行压成一个数：一共多少人、平均多少、最大最小、总和。这一集讲 COUNT、AVG、MAX、MIN、SUM。

### 步骤

1. 五个函数各管一件事：`COUNT()` 数行、`AVG()` 平均、`MAX()` 最大、`MIN()` 最小、`SUM()` 求和。参数写列名，`COUNT(*)` 数的是行。
2. 它们都把一整列（或整张表）算成一个值，所以不写 GROUP BY 时，结果只有一行。
3. 关键差别：`COUNT(*)` 数所有行，`COUNT(列名)` 跳过该列为 NULL 的行；AVG 和 SUM 同样忽略 NULL。
4. 所以“平均薪水”用 AVG(salary) 时，没填薪水的人不参与分母。想按“包括没填的人”算，要先想清楚业务定义。

### SQL 示例

```
SELECT COUNT(*) AS 总人数,
       COUNT(salary) AS 有薪水人数,
       AVG(salary) AS 平均薪水
FROM employee;
```

说明：结果一行三列：总人数 4、有薪水人数 3、平均薪水 10000.00。因为小李的 salary 是 NULL，被 COUNT(salary) 和 AVG 跳过；10000 =（8000+10000+12000）÷3，不是除以 4。看这三个数就能理解 NULL 对统计的影响。

### 易错点

- 以为 COUNT(列) 和 COUNT(*) 一样。有 NULL 时结果会差。
- 把 AVG 的分母当总行数。它只算非 NULL 的行。
- 在 WHERE 里写 `WHERE COUNT(*) > 3`。聚合函数不能放在 WHERE，这类筛选要等 GROUP BY/HAVING（后续课）。

### 30 秒速记

COUNT 数、AVG 均、MAX/MIN 极值、SUM 和；不分组只出一行；聚合忽略 NULL。

### 自测

1. 员工 4 人，其中 1 人薪水为 NULL，COUNT(*) 和 COUNT(salary) 各是多少？
   - 答：COUNT(*) 是 4，COUNT(salary) 是 3。前者数行，后者只数该列非 NULL 的值。
2. 为什么 AVG(salary) 不等于 SUM(salary)/COUNT(*)？
   - 答：AVG 的分母是 COUNT(salary)，即非 NULL 的行数；COUNT(*) 把 NULL 行也算进分母，会把平均值拉低。两种算法对应不同的业务口径。

### 材料与来源

- [平台视频页] B站原视频 P17《17. 基础-SQL-DQL-聚合函数》 https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=17
- [平台视频页] 本集采样画面 p17_t30.jpg（约 119s） https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=17
- [官方文档] MySQL 8.0 Reference Manual: Aggregate Functions https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html

证据说明：以同版讲义公开镜像核对：讲义 2.6.4 聚合函数（p45–46）。原声字幕未取得（匿名接口字幕轨为空且需登录），讲师逐句讲解未核；本页示例、表与数字为站内原创，不是课堂原表。
