Mysql 02:集合函数(聚合函数)查询全解——COUNT/SUM/AVG/MAX/MIN 实战指南

在 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. WHEREHAVING 的区别

  • 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;

运行结果

班级 班级人数 班级总分 班级平均分 班级最高分 班级最低分
一班 3 272 90.67 95 85
二班 2 166 83.00 88 78
三班 2 55 55.00 55 55

五、核心总结

  1. 5 大核心函数COUNT 计数、SUM 求和、AVG 平均、MAX 最大、MIN 最小
  2. NULL 处理 :除 COUNT(*) 外,所有函数自动忽略 NULL
  3. 分组配合 :聚合函数常与 GROUP BY 搭配,实现分组统计
  4. 过滤规则WHERE 过滤行,HAVING 过滤分组,不可混用
  5. 适用场景:报表统计、数据汇总、业务分析、面试高频考点
相关推荐
Omics Pro2 小时前
端到端单细胞空间组学数据分析
大数据·数据库·人工智能·算法·数据挖掘·数据分析·aigc
wangjialelele2 小时前
一文读懂 Redis 持久化与事务
linux·数据库·redis·bootstrap
m0_706653232 小时前
开源键值存储数据库如何实现微秒级响应
数据库
小宇的天下2 小时前
Calibre LVS Circuit Comparison(1)
linux·数据库·lvs
羊小猪~~2 小时前
【QT】-- 模型与视图简介
开发语言·数据库·c++·后端·qt·前端框架·个人开发
曲幽2 小时前
FastAPI里玩转Redis和数据库的正确姿势,别让异步任务把你坑哭了!
redis·python·mysql·fastapi·web·celery·sqlalchemy·task·backgroundtask
荒川之神3 小时前
ORACLE 参数文件损坏恢复实例
数据库·oracle
拂晓神剑zzz3 小时前
Neo4j图数据库
数据库·neo4j
鬼蛟3 小时前
Redis
数据库·redis·缓存