MySQL分组查询(GROUP BY)基础使用详解。

267 阅读2分钟

MySQL分组查询(GROUP BY)基础使用详解

分组查询是MySQL中非常重要的数据分析功能,它允许我们按照某个或某些列的值对数据进行分组统计。

基本语法

	SELECT 列1, 列2, ..., 聚合函数(列)

	FROM 表名

	[WHERE 条件]

	GROUP BY 分组列1, 分组列2, ...

	[HAVING 分组后条件]

	[ORDER BY 排序列]

	[LIMIT 数量];

核心概念

  1. GROUP BY:指定分组的依据列

  2. 聚合函数:对每组数据进行计算的函数

    • COUNT(): 计数
    • SUM(): 求和
    • AVG(): 平均值
    • MAX(): 最大值
    • MIN(): 最小值

简单示例

示例表:学生成绩表(scores)

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

注意事项

  1. SELECT中的非聚合列必须出现在GROUP BY子句中
  2. WHERE在GROUP BY之前执行,HAVING在GROUP BY之后执行
  3. 分组查询通常性能消耗较大,大数据量时要注意优化

实际应用场景

  1. 统计销售数据(按地区、产品类别等)
  2. 分析用户行为(按年龄段、注册时间等)
  3. 生成报表数据(日报表、月报表等)

掌握GROUP BY可以让你从数据中提取更有价值的信息,是数据分析的基础技能之一。