MySQL的HAVING
语句用于在GROUP BY
子句对数据进行分组后,过滤满足特定条件的组。与WHERE
子句不同,HAVING
子句可以在过滤条件中使用聚合函数,而WHERE
子句则不能。通常,HAVING
子句与GROUP BY
子句一起使用,以实现对分组数据的高级过滤。
基本语法
SELECT 列1, 列2, ..., 聚合函数(列)
FROM 表名
WHERE 条件
GROUP BY 列1, 列2, ...
HAVING 条件
ORDER BY 列1, 列2, ...;
关键点解析
-
GROUP BY
子句:用于将结果集按照一个或多个列进行分组。 -
聚合函数:如
SUM
、COUNT
、AVG
、MAX
、MIN
等,用于对分组后的数据进行计算。 -
HAVING
子句:用于过滤分组后的结果,只能使用聚合函数或GROUP BY
中指定的列。 -
WHERE
子句:用于在分组前过滤行,不能使用聚合函数。
示例
假设有一个名为employees
的表,结构如下:
id | name | department | salary |
---|---|---|---|
1 | Alice | Sales | 5000 |
2 | Bob | Sales | 7000 |
3 | Charlie | HR | 8000 |
4 | David | HR | 10000 |
5 | Eve | IT | 9000 |
6 | Frank | IT | 10000 |
示例1:查找每个部门的工资总和大于15000的部门
SELECT department, SUM(salary) as total_salary
FROM employees
GROUP BY department
HAVING SUM(salary) > 15000;
运行结果:
department | total_salary |
---|---|
HR | 18000 |
IT | 19000 |
注释: 该查询首先按部门分组,然后计算每个部门的工资总和,最后过滤出总和大于15000的部门。 |
示例2:查找每个部门的平均工资大于8000的部门
SELECT department, AVG(salary) as average_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 8000;
运行结果:
department | average_salary |
---|---|
HR | 9000 |
IT | 9500 |
注释: 该查询计算每个部门的平均工资,并过滤出平均工资大于8000的部门。 |
示例3:查找每个部门中工资最高的员工,且最高工资大于8000
SELECT e.department, e.name, e.salary
FROM employees e
JOIN (
SELECT department, MAX(salary) as max_salary
FROM employees
GROUP BY department
HAVING max_salary > 8000
) m ON e.department = m.department AND e.salary = m.max_salary;
运行结果:
department | name | salary |
---|---|---|
HR | Charlie | 8000 |
HR | David | 10000 |
IT | Eve | 9000 |
IT | Frank | 10000 |
注释: 该查询首先找出每个部门的最高工资,过滤出最高工资大于8000的部门,然后join原始表获取这些部门中工资最高的员工信息。 |
示例4:查找员工数量大于1且工资总和大于15000的部门
SELECT department, COUNT(*) as num_employees, SUM(salary) as total_salary
FROM employees
GROUP BY department
HAVING COUNT(*) > 1 AND SUM(salary) > 15000;
运行结果:
department | num_employees | total_salary |
---|---|---|
HR | 2 | 18000 |
IT | 2 | 19000 |
注释: 该查询过滤出员工数量大于1且工资总和大于15000的部门。 |
示例5:查找工资范围(最大工资 - 最小工资)大于2000的部门
SELECT department, MAX(salary) - MIN(salary) as salary_range
FROM employees
GROUP BY department
HAVING MAX(salary) - MIN(salary) > 2000;
运行结果:
department | salary_range |
---|---|
Sales | 2000 |
HR | 2000 |
注释: 该查询计算每个部门的工资范围,并过滤出范围大于2000的部门。 |
结论
HAVING
语句是MySQL中用于分组后过滤的强大工具,它允许使用聚合函数来筛选满足条件的组。通过结合GROUP BY
子句和HAVING
子句,可以实现对数据的复杂查询和分析。正确理解和使用HAVING
语句,能够帮助数据库管理员和开发人员更高效地从数据库中提取有价值的信息。