数据库分组统计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用于分组前的筛选。- 实际开发中,分组统计常用于报表、数据分析等场景。
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据