一、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 '、' |
|
📌 默认最大长度
plain
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) |
样本标准差 | ✅ |
📌 关系公式:
plain
STDDEV = √VARIANCE
4️⃣ 位运算聚合(位掩码场景)
| 函数功能 | 作用行动 | 示例 | 典型场景 |
|---|---|---|---|
BIT_AND(expr) |
按位与 | BIT_AND(flag) |
权限交集 |
BIT_OR(expr) |
按位或 | BIT_OR(flag) |
权限合集 |
BIT_XOR(expr) |
按位异或 | BIT_XOR(flag) |
状态翻转 |
📌 示例:
plain
-- 所有人都具备的权限
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 不可重复 |
📌 示例:
plain
SELECT
dept_id,
JSON_ARRAYAGG(name) AS users
FROM user
GROUP BY dept_id;
6️⃣ 逻辑聚合(布尔判断)
| 函数功能 | 作用行动 | 返回值 | 示例 |
|---|---|---|---|
BOOL_AND(expr) |
是否全部为 TRUE | 0 / 1 | BOOL_AND(score >= 60) |
BOOL_OR(expr) |
是否存在 TRUE | 0 / 1 | BOOL_OR(is_admin) |
📌 常用于 业务规则校验
plain
-- 判断某部门是否全部通过考核
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 |
📌 示例:
plain
SELECT
dept_id,
ANY_VALUE(dept_name),
COUNT(*)
FROM dept_user
GROUP BY dept_id;
📌 注意 📌注意
- 不保证是哪一行
- 只用于"我不关心具体值"的字段
二、聚合函数通用注意事项(非常重要)
1️⃣ GROUP BY 规则(MySQL 8 默认开启)
plain
ONLY_FULL_GROUP_BY
❌ 错误:
plain
SELECT name, COUNT(*) FROM user;
✅ 正确:
plain
SELECT name, COUNT(*) FROM user GROUP BY name;
或:
plain
SELECT ANY_VALUE(name), COUNT(*) FROM user;
2️⃣ WHERE vs HAVING2️⃣ 地点 vs 拥有
| 关键字 | 过滤时机 | 是否可用聚合函数 |
|---|---|---|
WHERE |
分组前 | ❌ |
HAVING |
分组后 | ✅ |
plain
HAVING COUNT(*) > 5
3️⃣ NULL 影响总结
| 函数功能 | NULL 行 |
|---|---|
COUNT(*) |
计算 |
COUNT(col) |
不计算 |
SUM/AVG |
忽略 |
MIN/MAX |
忽略 |
BOOL_AND/OR |
NULL 会影响结果 |