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