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 会影响结果
相关推荐
asdfg1258963几秒前
一文通俗理解JDBC中的核心概念+案例
java·数据库·oracle·jdbc
点灯小铭8 分钟前
基于单片机与DAC0832的双路波形信号发生系统设计
数据库·单片机·mongodb·毕业设计·课程设计·期末大作业
小陈phd13 分钟前
Text2SQL智能体学习笔记(二)——NL2SQL落地的隐形基石:元数据库
数据库·笔记·学习
霸道流氓气质14 分钟前
阿里云 OSS 从零到实战:概念、配置与 Spring Boot 集成指南
数据库·spring boot·阿里云
茉莉玫瑰花茶15 分钟前
综合案例 - AI 智能租房助手 [ 4 ]
数据库·python·ai·langgraph
ULIi096kr17 分钟前
MySQL查看表创建时间、修改时间、最后更新时间(精准排查僵尸表)
数据库·mysql
折哥的程序人生 · 物流技术专研30 分钟前
Tomcat 严重警告:JDBC 驱动未注销 + 工作线程泄漏 —— 原因、影响与彻底修复(生产级终极指南)
java·运维·数据库·mysql·oracle·tomcat
初圣魔门首席弟子35 分钟前
Qt C++ 项目实战:修改共享头文件后的高效增量编译与快速发布流程
数据库
wb0430720136 分钟前
仓库搬家不停业——从阿明的“在线换仓库“,看数据库迁移与 Schema 演进的实战方法论
数据库·adb·架构
lx1885486989640 分钟前
Redis大Key阻塞:单线程CPU100%的致命陷阱
数据库·redis·缓存