在 MySQL 中,集合函数(也叫聚合函数) 是对一组数据进行统计计算的核心工具,常用于数据汇总、报表生成、分组统计等场景。本文将围绕图片中的 5 大核心集合函数,从语法、用法、代码示例三个维度,带你彻底掌握 MySQL 聚合查询。
一、核心集合函数总览
| 函数名 |
功能 |
适用场景 |
注意事项 |
COUNT() |
统计行数 / 非空值数量 |
统计记录数、去重计数 |
COUNT(*) 统计所有行,COUNT(字段) 忽略 NULL |
SUM() |
对数值型字段求和 |
计算总分、总销售额 |
仅支持数值类型,自动忽略 NULL |
AVG() |
计算数值型字段平均值 |
计算平均分、平均工资 |
仅支持数值类型,自动忽略 NULL |
MAX() |
求字段最大值 |
最高分、最高销售额 |
支持数值、字符串、日期类型 |
MIN() |
求字段最小值 |
最低分、最低销售额 |
支持数值、字符串、日期类型 |
二、各函数详解 + 代码示例
准备测试数据
先创建一张学生成绩表 student_score,用于后续所有示例:
-- 创建表
CREATE TABLE student_score (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
subject VARCHAR(20) NOT NULL,
score INT,
class VARCHAR(10) NOT NULL
);
-- 插入测试数据(含 NULL 用于演示 COUNT 特性)
INSERT INTO student_score (name, subject, score, class) VALUES
('张三', '语文', 85, '一班'),
('张三', '数学', 92, '一班'),
('李四', '语文', 78, '二班'),
('李四', '数学', 88, '二班'),
('王五', '语文', 95, '一班'),
('赵六', '英语', NULL, '三班'), -- 成绩为 NULL
('孙七', '数学', 55, '三班');
1. COUNT():统计行数 / 非空值
核心用法
COUNT(*):统计所有行数,包含 NULL 行
COUNT(字段):统计字段非空的行数,自动忽略 NULL
COUNT(DISTINCT 字段):统计去重后的非空值数量
代码示例
-- 1. 统计总记录数(包含 NULL 行)
SELECT COUNT(*) AS 总记录数 FROM student_score;
-- 2. 统计成绩非空的记录数(忽略赵六的 NULL 成绩)
SELECT COUNT(score) AS 有效成绩数 FROM student_score;
-- 3. 统计去重后的班级数量
SELECT COUNT(DISTINCT class) AS 班级数量 FROM student_score;
运行结果
说明
COUNT(*) 会统计表中所有 7 条记录,包括赵六的 NULL 行
COUNT(score) 只统计 6 条非空成绩,自动忽略 NULL
COUNT(DISTINCT class) 统计 3 个不重复的班级(一班、二班、三班)
2. SUM():数值求和
核心用法
SUM(字段):对指定数值字段求和,自动忽略 NULL
- 仅支持数值类型(INT、FLOAT、DECIMAL 等),非数值类型结果为 0
代码示例
-- 1. 统计所有学生的成绩总和
SELECT SUM(score) AS 成绩总和 FROM student_score;
-- 2. 按班级分组,统计每个班的成绩总和
SELECT class, SUM(score) AS 班级总分 FROM student_score GROUP BY class;
-- 3. 统计张三的个人总分
SELECT SUM(score) AS 张三总分 FROM student_score WHERE name = '张三';
运行结果
| class |
班级总分 |
| 一班 |
272 |
| 二班 |
166 |
| 三班 |
55 |
说明
- 自动忽略赵六的 NULL 成绩,仅对 6 个有效分数求和
- 可配合
GROUP BY 实现分组统计,是报表统计的核心用法
3. AVG():求平均值
核心用法
AVG(字段):计算数值字段的平均值,自动忽略 NULL
- 等价于
SUM(字段) / COUNT(字段)
代码示例
-- 1. 计算所有有效成绩的平均分
SELECT AVG(score) AS 整体平均分 FROM student_score;
-- 2. 按班级分组,计算每个班的平均分
SELECT class, AVG(score) AS 班级平均分 FROM student_score GROUP BY class;
-- 3. 计算张三的平均分
SELECT AVG(score) AS 张三平均分 FROM student_score WHERE name = '张三';
运行结果
| class |
班级平均分 |
| 一班 |
90.6667 |
| 二班 |
83.0000 |
| 三班 |
55.0000 |
说明
- 自动忽略 NULL,整体平均分 = 493 / 6 ≈ 82.17
- 可配合
ROUND() 保留小数:ROUND(AVG(score), 2) 保留 2 位小数
4. MAX():求最大值
核心用法
MAX(字段):求字段的最大值
- 支持数值、字符串、日期 类型:
- 数值:按大小比较
- 字符串:按字典序比较
- 日期:按时间先后比较(越晚越大)
代码示例
-- 1. 求所有成绩中的最高分
SELECT MAX(score) AS 最高分 FROM student_score;
-- 2. 按班级分组,求每个班的最高分
SELECT class, MAX(score) AS 班级最高分 FROM student_score GROUP BY class;
-- 3. 求字符串最大值(按字典序,'赵六' > '张三')
SELECT MAX(name) AS 姓名最大值 FROM student_score;
运行结果
| class |
班级最高分 |
| 一班 |
95 |
| 二班 |
88 |
| 三班 |
55 |
5. MIN():求最小值
核心用法
MIN(字段):求字段的最小值
- 支持类型与
MAX() 完全一致,逻辑相反
代码示例
-- 1. 求所有成绩中的最低分
SELECT MIN(score) AS 最低分 FROM student_score;
-- 2. 按班级分组,求每个班的最低分
SELECT class, MIN(score) AS 班级最低分 FROM student_score GROUP BY class;
-- 3. 求字符串最小值(按字典序,'李四' < '张三')
SELECT MIN(name) AS 姓名最小值 FROM student_score;
运行结果
| class |
班级最低分 |
| 一班 |
85 |
| 二班 |
78 |
| 三班 |
55 |
三、集合函数核心注意事项
1. NULL 处理规则
- 所有聚合函数自动忽略 NULL 值 (除
COUNT(*) 外)
- 若字段全为 NULL,
SUM()/AVG() 结果为 NULL,COUNT() 结果为 0
2. WHERE 与 HAVING 的区别
WHERE:在分组前 过滤行,不能使用聚合函数
HAVING:在分组后 过滤分组结果,必须配合 GROUP BY 使用,可使用聚合函数
错误示例(WHERE 用聚合函数)
-- 错误!WHERE 不能用聚合函数
SELECT class, AVG(score) FROM student_score WHERE AVG(score) > 80 GROUP BY class;
正确示例(HAVING 过滤分组)
-- 正确:HAVING 过滤分组后的数据
SELECT class, AVG(score) AS 平均分
FROM student_score
GROUP BY class
HAVING AVG(score) > 80;
3. 分组查询的字段限制
- 使用
GROUP BY 分组后,SELECT 后只能跟分组字段 和聚合函数,否则报错
- 错误示例:
-- 错误!name 不是分组字段,也不是聚合函数
SELECT name, AVG(score) FROM student_score GROUP BY class;
四、综合实战:多函数组合查询
-- 需求:按班级分组,统计每个班的人数、总分、平均分、最高分、最低分
SELECT
class AS 班级,
COUNT(*) AS 班级人数,
SUM(score) AS 班级总分,
ROUND(AVG(score), 2) AS 班级平均分,
MAX(score) AS 班级最高分,
MIN(score) AS 班级最低分
FROM student_score
GROUP BY class
ORDER BY 班级平均分 DESC;
运行结果
| 班级 |
班级人数 |
班级总分 |
班级平均分 |
班级最高分 |
班级最低分 |
| 一班 |
3 |
272 |
90.67 |
95 |
85 |
| 二班 |
2 |
166 |
83.00 |
88 |
78 |
| 三班 |
2 |
55 |
55.00 |
55 |
55 |
五、核心总结
- 5 大核心函数 :
COUNT 计数、SUM 求和、AVG 平均、MAX 最大、MIN 最小
- NULL 处理 :除
COUNT(*) 外,所有函数自动忽略 NULL
- 分组配合 :聚合函数常与
GROUP BY 搭配,实现分组统计
- 过滤规则 :
WHERE 过滤行,HAVING 过滤分组,不可混用
- 适用场景:报表统计、数据汇总、业务分析、面试高频考点