数据库分组统计GROUP和分组筛选HAVING
前言
在日常的数据分析和报表开发中,分组统计是非常常见的需求。MySQL 提供了 GROUP BY
语句用于分组统计,而 HAVING
子句则用于分组后的筛选。本文将详细讲解如何在 MySQL 中使用分组、分组的适用场景、实际案例与代码示例,并介绍分组查询如何显示其他字段以及分组后再进行筛选的方法。
一、为什么要使用分组统计?
当我们需要对某一字段的不同取值进行分类汇总时,就需要用到分组统计。例如,统计每个部门的员工人数、每个商品的销售总额等。
二、GROUP BY 的基本用法
GROUP BY
用于将查询结果按照一个或多个字段进行分组,通常与聚合函数(如 COUNT
、SUM
、AVG
、MAX
、MIN
)一起使用。
语法结构
SELECT 分组字段, 聚合函数(统计字段)
FROM 表名
WHERE 条件
GROUP BY 分组字段;
示例:统计每个部门的员工人数
假设有如下员工表 employees
:
id | name | department | salary |
---|---|---|---|
1 | 张三 | 技术部 | 8000 |
2 | 李四 | 技术部 | 9000 |
3 | 王五 | 销售部 | 7000 |
4 | 赵六 | 技术部 | 8500 |
5 | 钱七 | 销售部 | 7500 |
统计每个部门的员工人数:
SELECT department, COUNT(*) AS emp_count
FROM employees
GROUP BY department;
结果:
department | emp_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;
结果:
department | emp_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
用于分组前的筛选。- 实际开发中,分组统计常用于报表、数据分析等场景。
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据