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

运行结果

班级 班级人数 班级总分 班级平均分 班级最高分 班级最低分
一班 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. 适用场景:报表统计、数据汇总、业务分析、面试高频考点
相关推荐
todoitbo几秒前
报表总在扫大表,列存储应该放在哪一层
大数据·数据库·报表·国产数据库
瑞克-桑切斯1 分钟前
MySQL部署手册(5.7.20/8.0)
数据库·mysql
ss27317 分钟前
AI时代首先数据库-PostgreSQL实战笔记 | 19 PostgreSQL逻辑备份:pg_dump与pg_dumpall
数据库·笔记·postgresql
啵啵啵鱼19 分钟前
九、JDBC 操作 MySQL 数据库
android·数据库·mysql
handonch20 分钟前
MySQL → Kingbase PG模式 高频SQL替换清单
数据库·mysql·postgresql
姜鱼问生23 分钟前
Kuma SQLite 备份坑
数据库·sqlite
水无痕simon27 分钟前
15 MySQL是怎么保证高可用的?
数据库·mysql
漫步人生走在路上32 分钟前
外贸SEO中的品牌词与产品词策略:大卖家和小卖家的不同打法
大数据·javascript·网络·数据库·人工智能·搜索引擎
张小姐的猫32 分钟前
【MySQL】数据类型
android·linux·数据库·c++·mysql·adb·php
泡海椒35 分钟前
JQuick-SQL LIMIT 分页:限制行数与偏移查询
数据库·sql