1. HAVING的作用
HAVING是用于对分组后的结果集进行过滤的,与WHERE的作用类似。但WHERE用于单子句中,HAVING则必须在GROUP BY语句之后使用。通过HAVING语句,可以对分组后的结果进行筛选,只输出符合条件的组。
2. HAVING语法
HAVING的语法格式如下:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value;
其中,aggregate_function为聚合函数,column_name为要聚合的列,operator为操作符,value为要比较的值。
2.1 HAVING示例
以下示例中,我们从orders表中按照customer_id进行分组,筛选出花费大于1000的用户:
SELECT customer_id, SUM(cost)
FROM orders
GROUP BY customer_id
HAVING SUM(cost) > 1000;
以上SQL语句的执行结果将只会包含花费大于1000的用户。
3. HAVING使用注意事项
3.1 WHERE和HAVING的区别
WHERE用于过滤原始数据,而HAVING用于过滤分组后的结果。因此,WHERE可以用于任何查询,而HAVING只能用于列有聚合函数的查询。
3.2 HAVING与ORDER BY的关系
在含有HAVING的SQL查询中,ORDER BY一般位于HAVING语句之后。当GROUP BY与HAVING一起使用时,ORDER BY也必须在它们之后。
3.3 HAVING与DISTINCT的关系
DISTINCT并不会影响HAVING子句中的结果。如果希望HAVING作用在DISTINCT后的结果之上,则需要将DISTINCT的结果作为一个内部表,然后在外部查找符合条件的行。
4. HAVING的使用实例
以下示例中,我们将使用Northwind数据库上的employees表。
4.1 按照城市进行分组,求出每个城市的员工数量
SELECT city, COUNT(*)
FROM employees
GROUP BY city;
4.2 按照城市进行分组,仅显示员工数量大于1的城市
SELECT city, COUNT(*)
FROM employees
GROUP BY city
HAVING COUNT(*) > 1;
4.3 按照城市和性别进行分组,求出每个城市不同性别的员工数量
SELECT city, gender, COUNT(*)
FROM employees
GROUP BY city, gender;
4.4 按照城市和性别进行分组,仅显示员工数量大于1的城市和性别
SELECT city, gender, COUNT(*)
FROM employees
GROUP BY city, gender
HAVING COUNT(*) > 1;
4.5 按照城市和性别进行分组,求出每个城市不同性别的平均薪资
SELECT city, gender, AVG(salary)
FROM employees
GROUP BY city, gender;
4.6 按照城市和性别进行分组,仅显示平均薪资大于5000的城市和性别
SELECT city, gender, AVG(salary)
FROM employees
GROUP BY city, gender
HAVING AVG(salary) > 5000;
5. 总结
HAVING语句用于对分组后的结果进行过滤,可以对分组后的结果进行筛选,只输出符合条件的组。在使用HAVING时,需要注意HAVING仅能用于列有聚合函数的查询,并且ORDER BY必须在HAVING之后,DISTINCT不会影响HAVING子句中的结果。