首页/数据/数据库速查/聚合函数 COUNT / SUM / AVG / MAX / MIN
SQL 语法52 条

聚合函数 COUNT / SUM / AVG / MAX / MIN

五大聚合函数覆盖计数、求和、均值与极值;COUNT 区分列与星号语义、COUNT 对 NULL 的处理是常见考点。

数据库速查数据更新于 2026-10-13

聚合函数是什么

聚合函数把多行数据压缩成一个结果:计数、求和、平均、取极值,以及把多行字符串拼成一个字段,通常与分组一起使用。有一条必须记住的规则:除了统计全部行以外,其他聚合都会忽略空值——这意味着求和与平均的结果可能和直觉不同,统计某个字段得到的数字也不是总行数。

基本信息

用途对多行数据做统计汇总
常用函数计数、求和、平均、最大最小、字符串拼接
空值处理除统计全部行外均忽略空值
搭配子句通常与分组、排序、分组过滤一起使用
结果类型定点小数列的求和与平均保持精度
字符串拼接受长度参数限制,超出会截断

典型使用场景

  • 统计订单总量与金额合计
  • 计算平均客单价与最大单笔金额
  • 统计某字段的非空行数,评估数据完整度
  • 把多行明细拼成一个字段用于报表展示
  • 按分组维度输出指标,作为看板的数据源

常用示例

常用示例
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;   # 需要把空值当零参与计算时先包一层

函数与空值行为

函数作用空值行为
统计全部行统计所有行不忽略任何行
计数某列统计该列非空行数跳过空值
求和累加数值跳过空值,全为空时返回空
平均计算均值跳过空值,分母是非空行数
最大最小取极值忽略空值
字符串拼接合并多行文本跳过空值,受长度上限约束
去重计数统计不同值个数跳过空值,开销更高
统计全部行与统计某列是两种口径:前者把空值行也算进去,后者只统计该列非空的行,两者混用会让报表数字对不上。
字符串拼接受长度参数限制,超出部分会被静默截断;拼接前先评估行数与字段长度,必要时分批处理或改到应用层拼接。
整列都为空时求和与平均返回空值而不是零,展示层要单独处理这个边界,否则会出现空白或计算报错。

聚合使用检查清单

  • 明确口径:统计全部行还是统计非空行
  • 空值要参与计算时先用函数补默认值
  • 字符串拼接前评估总长度,必要时调大限制
  • 聚合与明细同时返回时检查分组约束
  • 大表上的全量聚合避开业务高峰执行
聚合结果依赖参与计算的行集合:在分组下游再叠加过滤条件时,先确认过滤发生在分组前还是分组后,否则统计口径会与预期差一层。

易错点

  • 把计数某列当成总行数:空值行不会被统计,口径与预期不符
  • 认为求和与平均会把空值当零:它们直接跳过空值,结果与直觉不同
  • 字符串拼接超出长度上限被静默截断:下游拿到不完整数据且没有报错提示
  • 在大表上无意触发全量聚合:统计查询扫描全部数据,高峰期挤压业务资源,应先限定范围或走汇总表

数据来源与参考

  • MySQL 8.0 Reference Manual: Aggregate Functions

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌