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 会影响结果
相关推荐
jiayou641 天前
KingbaseES 表级与列级加密完全指南
数据库·后端
GBASE2 天前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
xiezhr2 天前
逛GitHub发现了一款免费的带AI功能的数据库管理工具
数据库·ai编程·dba
唐青枫3 天前
MySQL JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
sql·mysql
吃糖的小孩3 天前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
小满8783 天前
5.Mysql事务隔离级别与锁机制
mysql
笃行3504 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3504 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3504 天前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
元Y亨H4 天前
技术笔记:MySQL 字符集排序规则与大小写敏感性问题解决方案
mysql