一、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) | 是否全部为 TRUE | 0 / 1 | BOOL_AND(score >= 60) |
BOOL_OR(expr) | 是否存在 TRUE | 0 / 1 | BOOL_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/OR | NULL 会影响结果 |