MySQL 聚合函数总表(完整版)

31 阅读3分钟

一、MySQL 聚合函数总表(完整版)

说明:

  • 聚合函数:对多行数据 → 汇总为一行
  • 通常与 GROUP BY 一起使用
  • 若无 GROUP BY,默认全表作为一组

1️⃣ 基础统计类

函数功能作用行动是否忽略 NULL示例注意事项
COUNT(*)统计行数❌ 不忽略COUNT(*)包含 NULL 行
COUNT(expr)统计非 NULL 值个数✅ 忽略COUNT(age)expr 为 NULL 不计数
SUM(expr)求和✅ 忽略SUM(score)非数值会报错
AVG(expr)平均值✅ 忽略AVG(score)= SUM / COUNT= 总和 / 计数
MIN(expr)最小值✅ 忽略MIN(create_time)字符串按字典序
MAX(expr)最大值✅ 忽略MAX(level)同上

2️⃣ 字符串聚合

函数功能作用行动示例注意事项
GROUP_CONCAT(expr)多行拼成字符串GROUP_CONCAT(name)有长度限制
GROUP_CONCAT(DISTINCT expr)去重拼接GROUP_CONCAT(DISTINCT name)
GROUP_CONCAT(expr ORDER BY col)排序拼接GROUP_CONCAT(name ORDER BY id DESC)
GROUP_CONCAT(expr SEPARATOR sep)自定义分隔符SEPARATOR '、'

📌 默认最大长度

SHOW VARIABLES LIKE 'group_concat_max_len';

3️⃣ 方差 / 标准差(统计类)

函数功能说明是否推荐
VAR_POP(expr)总体方差身体方向差异✅ 推荐
VAR_SAMP(expr)样本方差✅ 推荐
VARIANCE(expr)= VAR_POP⚠️ 旧别名
STD(expr)= STDDEV_POP⚠️
STDDEV(expr)= STDDEV_POP⚠️
STDDEV_POP(expr)总体标准差
STDDEV_SAMP(expr)样本标准差

📌 关系公式:

STDDEV = √VARIANCE

4️⃣ 位运算聚合(位掩码场景)

函数功能作用行动示例典型场景
BIT_AND(expr)按位与BIT_AND(flag)权限交集
BIT_OR(expr)按位或BIT_OR(flag)权限合集
BIT_XOR(expr)按位异或BIT_XOR(flag)状态翻转

📌 示例:

-- 所有人都具备的权限
SELECT BIT_AND(permission_mask) FROM user_permission;

5️⃣ JSON 聚合(MySQL 5.7+ / 8.0 推荐)

函数功能作用行动示例说明
JSON_ARRAYAGG(expr)聚合为 JSON 数组JSON_ARRAYAGG(name)前端友好
JSON_OBJECTAGG(k, v)聚合为 JSON 对象JSON_OBJECTAGG(id, name)key 不可重复

📌 示例:

SELECT
  dept_id,
  JSON_ARRAYAGG(name) AS users
FROM user
GROUP BY dept_id;

6️⃣ 逻辑聚合(布尔判断)

函数功能作用行动返回值示例
BOOL_AND(expr)是否全部为 TRUE0 / 1BOOL_AND(score >= 60)
BOOL_OR(expr)是否存在 TRUE0 / 1BOOL_OR(is_admin)

📌 常用于 业务规则校验

-- 判断某部门是否全部通过考核
SELECT BOOL_AND(pass = 1)
FROM exam
WHERE dept_id = 1;

7️⃣ ANY_VALUE(ONLY_FULL_GROUP_BY 解决方案)

函数功能作用行动场景
ANY_VALUE(expr)随机取组内某个值规避 ONLY_FULL_GROUP_BY

📌 示例:

SELECT
  dept_id,
  ANY_VALUE(dept_name),
  COUNT(*)
FROM dept_user
GROUP BY dept_id;

📌 注意 📌注意

  • 不保证是哪一行
  • 只用于“我不关心具体值”的字段

二、聚合函数通用注意事项(非常重要)

1️⃣ GROUP BY 规则(MySQL 8 默认开启)

ONLY_FULL_GROUP_BY

❌ 错误:

SELECT name, COUNT(*) FROM user;

✅ 正确:

SELECT name, COUNT(*) FROM user GROUP BY name;

或:

SELECT ANY_VALUE(name), COUNT(*) FROM user;

2️⃣ WHERE vs HAVING2️⃣ 地点 vs 拥有

关键字过滤时机是否可用聚合函数
WHERE分组前
HAVING分组后
HAVING COUNT(*) > 5

3️⃣ NULL 影响总结

函数功能NULL 行
COUNT(*)计算
COUNT(col)不计算
SUM/AVG忽略
MIN/MAX忽略
BOOL_AND/ORNULL 会影响结果