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 会影响结果
相关推荐
剩下了什么5 小时前
MySQL JSON_SET() 函数
数据库·mysql·json
山峰哥6 小时前
数据库工程与SQL调优——从索引策略到查询优化的深度实践
数据库·sql·性能优化·编辑器
较劲男子汉6 小时前
CANN Runtime零拷贝传输技术源码实战 彻底打通Host与Device的数据传输壁垒
运维·服务器·数据库·cann
java搬砖工-苤-初心不变6 小时前
MySQL 主从复制配置完全指南:从原理到实践
数据库·mysql
WangYaolove13147 小时前
基于python的在线水果销售系统(源码+文档)
python·mysql·django·毕业设计·源码
山岚的运维笔记8 小时前
SQL Server笔记 -- 第18章:Views
数据库·笔记·sql·microsoft·sqlserver
roman_日积跬步-终至千里9 小时前
【LangGraph4j】LangGraph4j 核心概念与图编排原理
java·服务器·数据库
汇智信科9 小时前
打破信息孤岛,重构企业效率:汇智信科企业信息系统一体化运营平台
数据库·重构
野犬寒鸦9 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
霖霖总总9 小时前
[小技巧66]当自增主键耗尽:MySQL 主键溢出问题深度解析与雪花算法替代方案
mysql·算法