聚合函数是什么
聚合函数把多行数据压缩成一个结果:计数、求和、平均、取极值,以及把多行字符串拼成一个字段,通常与分组一起使用。有一条必须记住的规则:除了统计全部行以外,其他聚合都会忽略空值——这意味着求和与平均的结果可能和直觉不同,统计某个字段得到的数字也不是总行数。
基本信息
| 用途 | 对多行数据做统计汇总 |
|---|---|
| 常用函数 | 计数、求和、平均、最大最小、字符串拼接 |
| 空值处理 | 除统计全部行外均忽略空值 |
| 搭配子句 | 通常与分组、排序、分组过滤一起使用 |
| 结果类型 | 定点小数列的求和与平均保持精度 |
| 字符串拼接 | 受长度参数限制,超出会截断 |
典型使用场景
- 统计订单总量与金额合计
- 计算平均客单价与最大单笔金额
- 统计某字段的非空行数,评估数据完整度
- 把多行明细拼成一个字段用于报表展示
- 按分组维度输出指标,作为看板的数据源
常用示例
常用示例
SELECT COUNT(*) AS rows_cnt, COUNT(email) AS email_cnt FROM users; # 全部行数与有邮箱的行数不同
SELECT SUM(amount) AS total, AVG(amount) AS avg_amt FROM orders WHERE status='paid'; # 合计与均值
SELECT MAX(created_at) AS last_order FROM orders; # 最近一单时间
SELECT user_id, GROUP_CONCAT(sku ORDER BY id SEPARATOR ',') AS skus # 把同用户商品拼成一行
FROM order_items GROUP BY user_id;空值影响演示
空值影响演示
SELECT COUNT(*), COUNT(amount), SUM(amount), AVG(amount) FROM orders; # 四个口径互不相同
# 统计全部行会把空值行算进去,计数列与求和都会跳过空值
SELECT SUM(IFNULL(amount,0)) FROM orders; # 需要把空值当零参与计算时先包一层函数与空值行为
| 函数 | 作用 | 空值行为 |
|---|---|---|
| 统计全部行 | 统计所有行 | 不忽略任何行 |
| 计数某列 | 统计该列非空行数 | 跳过空值 |
| 求和 | 累加数值 | 跳过空值,全为空时返回空 |
| 平均 | 计算均值 | 跳过空值,分母是非空行数 |
| 最大最小 | 取极值 | 忽略空值 |
| 字符串拼接 | 合并多行文本 | 跳过空值,受长度上限约束 |
| 去重计数 | 统计不同值个数 | 跳过空值,开销更高 |
统计全部行与统计某列是两种口径:前者把空值行也算进去,后者只统计该列非空的行,两者混用会让报表数字对不上。
字符串拼接受长度参数限制,超出部分会被静默截断;拼接前先评估行数与字段长度,必要时分批处理或改到应用层拼接。
整列都为空时求和与平均返回空值而不是零,展示层要单独处理这个边界,否则会出现空白或计算报错。
聚合使用检查清单
- 明确口径:统计全部行还是统计非空行
- 空值要参与计算时先用函数补默认值
- 字符串拼接前评估总长度,必要时调大限制
- 聚合与明细同时返回时检查分组约束
- 大表上的全量聚合避开业务高峰执行
聚合结果依赖参与计算的行集合:在分组下游再叠加过滤条件时,先确认过滤发生在分组前还是分组后,否则统计口径会与预期差一层。