MySQL分组查询(GROUP BY)基础使用详解
分组查询是MySQL中非常重要的数据分析功能,它允许我们按照某个或某些列的值对数据进行分组统计。
基本语法
SELECT 列1, 列2, ..., 聚合函数(列)
FROM 表名
[WHERE 条件]
GROUP BY 分组列1, 分组列2, ...
[HAVING 分组后条件]
[ORDER BY 排序列]
[LIMIT 数量];
核心概念
-
GROUP BY:指定分组的依据列
-
聚合函数:对每组数据进行计算的函数
- COUNT(): 计数
- SUM(): 求和
- AVG(): 平均值
- MAX(): 最大值
- MIN(): 最小值
简单示例
示例表:学生成绩表(scores)
| id | name | class | score |
|---|---|---|---|
| 1 | 张三 | 一班 | 85 |
| 2 | 李四 | 一班 | 90 |
| 3 | 王五 | 二班 | 78 |
| 4 | 赵六 | 二班 | 92 |
1. 按班级统计平均分
SELECT class, AVG(score) AS avg_score
FROM scores
GROUP BY class;
结果:
class | avg_score
------|----------
一班 | 87.5
二班 | 85.0
2. 统计每个班级的人数
SELECT class, COUNT(*) AS student_count
FROM scores
GROUP BY class;
结果:
class | student_count
------|-------------
一班 | 2
二班 | 2
结合WHERE和HAVING
- WHERE:在分组前过滤数据
- HAVING:在分组后过滤分组结果
示例:统计及格(>=60)学生的班级平均分,只显示平均分>=80的班级
SELECT class, AVG(score) AS avg_score
FROM scores
WHERE score >= 60 -- 先过滤出及格的学生
GROUP BY class
HAVING avg_score >= 80; -- 再过滤分组结果
多列分组
可以按多个列进行分组:
-- 假设表中有性别列gender
SELECT class, gender, AVG(score) AS avg_score
FROM scores
GROUP BY class, gender;
注意事项
- SELECT中的非聚合列必须出现在GROUP BY子句中
- WHERE在GROUP BY之前执行,HAVING在GROUP BY之后执行
- 分组查询通常性能消耗较大,大数据量时要注意优化
实际应用场景
- 统计销售数据(按地区、产品类别等)
- 分析用户行为(按年龄段、注册时间等)
- 生成报表数据(日报表、月报表等)
掌握GROUP BY可以让你从数据中提取更有价值的信息,是数据分析的基础技能之一。