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 会影响结果
相关推荐
这个DBA有点耶12 小时前
2026年分布式数据库有哪些主流选择?先评估这5个维度再决定
数据库·分布式·dba
这个DBA有点耶15 小时前
从MySQL 5.7到8.0:JSON查询性能差在哪?虚拟列索引vs多值索引怎么选
数据库·mysql·架构
胡写代码15 小时前
数据库审计字段,别再每张表各写一套了——我统一成这 6 个字段
数据库
SelectDB19 小时前
为什么 JSON 正在成为分析数据库新的竞争点?
数据库·json·agent
ClouGence20 小时前
开源数据库管理工具 CloudDM 4.2.0 发布,新增 GoldenDB、KingbaseES 等数据源
数据库·dba·devops
发霉的馒头20 小时前
ORA-00845: MEMORY_TARGET not supported on this system的解决方法
数据库
草莓熊Lotso1 天前
【Redis 初阶】Set 类型深度解析:去重集合的运算能力与实战场景
linux·网络·数据库·windows·redis·tcp/ip·缓存
煎饼皮皮侠1 天前
【设计】设计一个web版的数据库管理平台后端(之五) --借鉴mybatis
数据库·mybatis
东风破_1 天前
danci 2:创建的单词书到底存在哪里?从 Supabase 一路理解 ORM、Drizzle 和 RLS
数据库·后端·node.js
九皇叔叔1 天前
《MySQL 体系架构详解:Server 层、SQL 执行流程与 InnoDB、MyISAM、MEMORY 存储引擎》
sql·mysql·架构