前言

在日常的数据分析和报表开发中,分组统计是非常常见的需求。MySQL 提供了 GROUP BY 语句用于分组统计,而 HAVING 子句则用于分组后的筛选。本文将详细讲解如何在 MySQL 中使用分组、分组的适用场景、实际案例与代码示例,并介绍分组查询如何显示其他字段以及分组后再进行筛选的方法。

一、为什么要使用分组统计?

当我们需要对某一字段的不同取值进行分类汇总时,就需要用到分组统计。例如,统计每个部门的员工人数、每个商品的销售总额等。

二、GROUP BY 的基本用法

GROUP BY 用于将查询结果按照一个或多个字段进行分组,通常与聚合函数(如 COUNTSUMAVGMAXMIN)一起使用。

语法结构

SELECT 分组字段, 聚合函数(统计字段)
FROM 表名
WHERE 条件
GROUP BY 分组字段;

示例:统计每个部门的员工人数

假设有如下员工表 employees

idnamedepartmentsalary
1张三技术部8000
2李四技术部9000
3王五销售部7000
4赵六技术部8500
5钱七销售部7500

统计每个部门的员工人数:

SELECT department, COUNT(*) AS emp_count
FROM employees
GROUP BY department;

结果:

departmentemp_count
技术部3
销售部2

三、分组后如何显示其他字段?

在使用 GROUP BY 时,SELECT 语句中除了分组字段和聚合函数外,不能直接显示其他非分组字段,否则会报错或结果不确定。如果需要显示其他字段,可以结合聚合函数(如 MAX(name)MIN(salary) 等)或使用子查询。

示例:统计每个部门工资最高的员工姓名

SELECT department, MAX(salary) AS max_salary
FROM employees
GROUP BY department;

如果想显示工资最高的员工姓名,可以用子查询:

SELECT e.department, e.name, e.salary
FROM employees e
INNER JOIN (
    SELECT department, MAX(salary) AS max_salary
    FROM employees
    GROUP BY department
) t ON e.department = t.department AND e.salary = t.max_salary;

四、分组后再进行筛选(HAVING 的用法)

WHERE 用于分组前的筛选,HAVING 用于分组后的筛选。比如只显示员工数大于2的部门:

SELECT department, COUNT(*) AS emp_count
FROM employees
GROUP BY department
HAVING emp_count > 2;

结果:

departmentemp_count
技术部3

五、实际案例

案例1:统计每个部门平均工资大于8000的部门

SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING avg_salary > 8000;

案例2:统计每个部门员工工资总和,并按总和降序排列

SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department
ORDER BY total_salary DESC;

六、总结

  • GROUP BY 用于分组统计,常与聚合函数配合使用。
  • 分组后只能显示分组字段和聚合函数结果,其他字段需结合聚合函数或子查询。
  • HAVING 用于分组后的筛选,WHERE 用于分组前的筛选。
  • 实际开发中,分组统计常用于报表、数据分析等场景。
分类: MySQL 标签: MySQLGROUPHAVING

评论

暂无评论数据

暂无评论数据

目录