MySQL中高频聚合函数有6个:COUNT()、SUM()、AVG()、MAX()、MIN()、GROUP_CONCAT(),均需配合GROUP BY使用(全表聚合除外),且对NULL统一忽略。
MySQL 里没有叫“集合函数”的官方分类,你实际想查的是 聚合函数(Aggregate Functions)——也就是用来对一组行做统计计算、返回单个值的函数。别被

日常开发和报表中,以下 6 个几乎天天见,且必须配合 GROUP BY 使用(除非全表聚合):
COUNT():统计行数,COUNT(*) 计所有行,COUNT(col) 只计该列非 NULL 值SUM():求和,注意字段类型要是数值型,否则隐式转为 0 或报错AVG():平均值,自动忽略 NULL,但若整列全 NULL 会返回 NULL
MAX() / MIN():取最大/最小值,支持数值、字符串、日期(字符串按字典序,日期按时间序)GROUP_CONCAT():MySQL 特有,把分组内的多行拼成一个字符串,支持 DISTINCT、ORDER BY 和自定义 SEPARATOR
SELECT dep AS 部门,
COUNT(*) AS 员工数量,
SUM(salary) AS 薪资总和,
AVG(salary) AS 平均薪资,
MAX(salary) AS 最高薪资,
MIN(salary) AS 最低薪资,
GROUP_CONCAT(name ORDER BY salary DESC SEPARATOR ' | ') AS 员工名单
FROM emp
GROUP BY dep;
聚合函数对 NULL 的处理很统一(基本都跳过),但新手常栽在这几个点上:
COUNT(col) 统计“有值人数”,却忘了该列允许 NULL —— 结果比预期少WHERE 条件,但数据为空时,SUM() 返回 NULL 而不是 0,下游程序可能直接报空指针AVG(),MySQL 会尝试转成数字(如 '123abc' → 123,'abc' → 0),结果毫无意义GROUP_CONCAT() 默认长度限制是 1024 字符,超长会被截断,需提前设 GROUP_CONCAT_MAX_LEN 系统变量真要实现“同一行里算多个维度的统计”,别硬套子查询,优先用:
CASE WHEN + 聚合函数:例如统计各部门“高薪(>5000)人数”和“平均薪资”在同一 SELECT 中IF() 简化布尔判断:如 SUM(IF(salary > 5000, 1, 0)) 算高薪人数COUNT() OVER (PARTITION BY dep) 可在不 GROUP BY 的前提下补统计列,避免丢失明细行SELECT name, dep, salary,
COUNT(*) OVER (PARTITION BY dep) AS 部门人数,
AVG(salary) OVER (PARTITION BY dep) AS 部门平均薪资
FROM emp;
记住一点:聚合函数本质是“降维操作”,一旦用了 GROUP BY,SELECT 列里所有非聚合字段都必须出现在 GROUP BY 子句中,否则 MySQL 8.0+ 会直接报错(严格模式默认开启)。这不是 bug,是防止语义模糊的设计约束。