德国世界杯_2012年世界杯 - fyycdq.com

德国世界杯_2012年世界杯 - fyycdq.com

数据库分组统计GROUP和分组筛选HAVING

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

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

二、GROUP BY 的基本用法GROUP BY 用于将查询结果按照一个或多个字段进行分组,通常与聚合函数(如 COUNT、SUM、AVG、MAX、MIN)一起使用。

语法结构SELECT 分组字段, 聚合函数(统计字段)

FROM 表名

WHERE 条件

GROUP BY 分组字段;示例:统计每个部门的员工人数假设有如下员工表 employees:

idnamedepartmentsalary1张三技术部80002李四技术部90003王五销售部70004赵六技术部85005钱七销售部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 用于分组前的筛选。实际开发中,分组统计常用于报表、数据分析等场景。