SQL HAVING 子句
在 SQL 中,HAVING
子句用于对分组后的数据进行过滤。它与 WHERE
子句类似,但 WHERE
用于过滤行,而 HAVING
用于过滤分组。HAVING
子句通常与 GROUP BY
子句一起使用,以便对聚合结果进行筛选。
1. HAVING 子句的基本语法
HAVING
子句的基本语法如下:
sql
SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1
HAVING condition;
aggregate_function
是聚合函数,例如COUNT()
、SUM()
、AVG()
、MAX()
或MIN()
。condition
是过滤条件,通常涉及聚合函数的结果。
备注
HAVING
子句必须与 GROUP BY
子句一起使用,除非 SELECT
语句中只包含聚合函数。
2. HAVING 与 WHERE 的区别
- WHERE:用于在分组之前过滤行。
- HAVING:用于在分组之后过滤分组。
例如,假设我们有一个 orders
表,包含以下数据:
order_id | customer_id | amount |
---|---|---|
1 | 101 | 100 |
2 | 102 | 200 |
3 | 101 | 150 |
4 | 103 | 300 |
5 | 102 | 250 |
如果我们想找出总金额超过 300 的客户,可以使用 HAVING
子句:
sql
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 300;
输出结果:
customer_id | total_amount |
---|---|
102 | 450 |
103 | 300 |
提示
HAVING
子句的条件可以包含聚合函数,而 WHERE
子句的条件不能。
3. 实际应用场景
场景 1:筛选平均销售额超过特定值的部门
假设我们有一个 sales
表,包含以下数据:
sale_id | department | amount |
---|---|---|
1 | A | 100 |
2 | B | 200 |
3 | A | 150 |
4 | C | 300 |
5 | B | 250 |
我们想找出平均销售额超过 150 的部门:
sql
SELECT department, AVG(amount) AS avg_amount
FROM sales
GROUP BY department
HAVING AVG(amount) > 150;
输出结果:
department | avg_amount |
---|---|
B | 225 |
C | 300 |
场景 2:筛选订单数量超过特定值的客户
假设我们有一个 orders
表,包含以下数据:
order_id | customer_id | amount |
---|---|---|
1 | 101 | 100 |
2 | 102 | 200 |
3 | 101 | 150 |
4 | 103 | 300 |
5 | 102 | 250 |
我们想找出订单数量超过 1 的客户:
sql
SELECT customer_id, COUNT(order_id) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) > 1;
输出结果:
customer_id | order_count |
---|---|
101 | 2 |
102 | 2 |
4. 总结
HAVING
子句是 SQL 中用于对分组后的数据进行过滤的强大工具。它与 GROUP BY
子句一起使用,允许我们根据聚合函数的结果来筛选分组。通过本文的学习,你应该能够理解 HAVING
子句的基本用法,并在实际场景中应用它。
5. 附加资源与练习
练习 1
编写一个 SQL 查询,找出 sales
表中总销售额超过 500 的部门。
练习 2
编写一个 SQL 查询,找出 orders
表中订单数量超过 2 的客户。
附加资源
通过练习和进一步的学习,你将更加熟练地掌握 HAVING
子句的使用。