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

一、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 会影响结果
相关推荐
玄同7652 小时前
Python「焚诀」:吞噬所有语法糖的终极修炼手册
开发语言·数据库·人工智能·python·postgresql·自然语言处理·nlp
cdut_suye2 小时前
解锁函数的魔力:Python 中的多值传递、灵活参数与无名之美
java·数据库·c++·人工智能·python·机器学习·热榜
尽兴-2 小时前
MySQL 8.0高可用集群架构实战深度解析
数据库·mysql·架构·集群·高可用·innodb cluster
遇见火星2 小时前
MySQL常用命令大全(2026最新版)
数据库·mysql·oracle
霖霖总总2 小时前
[小技巧42]InnoDB 索引与 MVCC 的协同工作原理
运维·数据库·mysql
未来之窗软件服务2 小时前
计算机等级考试—数据库完整性进销存—东方仙盟练气期
数据库·oracle·计算机软考·仙盟创梦ide·东方仙盟
weixin_541299942 小时前
鸿蒙应用开发:保存应用数据 - 关系型数据库的使用
数据库·oracle·harmonyos
wei_shuo3 小时前
Oracle数据库迁移至KingbaseES:完整实战指南
数据库·oracle
磊磊cpp3 小时前
Ubuntu 22.04 离线安装教程(本地 APT 仓库 offline-repo)
数据库·ubuntu·postgresql