mysql SUM AVG属于集合函数吗_mysql聚合操作解析

来源:这里教程网 时间:2026-02-28 20:49:43 作者:

是的,

SUM
AVG
是 MySQL 的聚合函数(也称聚集函数、分组函数),不是“集合函数”——MySQL 中没有标准术语叫“集合函数”,容易和 SET 类型或数学集合操作混淆。

为什么叫“聚合函数”而不是“集合函数”?

MySQL 官方文档与 SQL 标准中统一使用

aggregate function
(聚合函数)。它描述的是“将多行输入聚合成单个输出值”的行为,比如把 100 行工资加总成一个总和,或算出一个平均数。

SUM
AVG
COUNT
MAX
MIN
GROUP_CONCAT
都属于这一类
“集合函数”不是 MySQL 的有效分类,搜索时用
mysql aggregate function
才能命中权威资料
某些 ORM 或 BI 工具里可能误用“集合”一词,但底层执行仍调用的是
AVG()
这类聚合函数

SUM
AVG
的参数限制与空值处理

它们只接受数值型表达式,且默认跳过

NULL
值——这是最常引发统计偏差的地方。

SUM(salary)
:仅对非
NULL
salary
求和;整列全
NULL
则返回
NULL
AVG(commission_pct)
:只基于有值的记录计算(例如 35 人有提成,107 人中有 72 人 commission_pct 为
NULL
,结果按 35 人算平均)
想按全员(107 人)算“平均提成率”,得写成
AVG(IFNULL(commission_pct, 0))
SUM(commission_pct) / COUNT(*)
对非数值列用
AVG(name)
不报错但返回
0.0000
(隐式转 0),属危险静默行为

COUNT
的关键区别:怎么数“行”?

COUNT
是唯一行为逻辑不同的聚合函数——它不忽略
NULL
的方式取决于写法:

COUNT(*)
:统计所有行,不管字段是否为
NULL
(引擎级计数,最快)
COUNT(salary)
:只统计
salary IS NOT NULL
的行数
SUM
AVG
没有
*
形式,必须指定列或表达式,且一律跳过
NULL
错误写法示例:
SELECT AVG(salary), COUNT(*) FROM employees WHERE department_id = 99;
—— 若该部门无人,
AVG
返回
NULL
,但
COUNT(*)
返回
0
,二者语义不一致需留意
SELECT 
  COUNT(*) AS total_rows,
  COUNT(salary) AS non_null_salary_count,
  SUM(salary) AS total_salary,
  AVG(salary) AS avg_salary_by_non_null,
  AVG(IFNULL(salary, 0)) AS avg_salary_by_all
FROM employees;

真正容易被忽略的点是:当业务要求“人均值”时,分母到底该用

COUNT(*)
还是
COUNT(字段)
,这直接决定结果是“全体人均”还是“有数据者人均”。别依赖默认行为,显式写清楚意图。

相关推荐