跳到主要内容

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_idcustomer_idamount
1101100
2102200
3101150
4103300
5102250

如果我们想找出总金额超过 300 的客户,可以使用 HAVING 子句:

sql
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 300;

输出结果:

customer_idtotal_amount
102450
103300
提示

HAVING 子句的条件可以包含聚合函数,而 WHERE 子句的条件不能。

3. 实际应用场景

场景 1:筛选平均销售额超过特定值的部门

假设我们有一个 sales 表,包含以下数据:

sale_iddepartmentamount
1A100
2B200
3A150
4C300
5B250

我们想找出平均销售额超过 150 的部门:

sql
SELECT department, AVG(amount) AS avg_amount
FROM sales
GROUP BY department
HAVING AVG(amount) > 150;

输出结果:

departmentavg_amount
B225
C300

场景 2:筛选订单数量超过特定值的客户

假设我们有一个 orders 表,包含以下数据:

order_idcustomer_idamount
1101100
2102200
3101150
4103300
5102250

我们想找出订单数量超过 1 的客户:

sql
SELECT customer_id, COUNT(order_id) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) > 1;

输出结果:

customer_idorder_count
1012
1022

4. 总结

HAVING 子句是 SQL 中用于对分组后的数据进行过滤的强大工具。它与 GROUP BY 子句一起使用,允许我们根据聚合函数的结果来筛选分组。通过本文的学习,你应该能够理解 HAVING 子句的基本用法,并在实际场景中应用它。

5. 附加资源与练习

练习 1

编写一个 SQL 查询,找出 sales 表中总销售额超过 500 的部门。

练习 2

编写一个 SQL 查询,找出 orders 表中订单数量超过 2 的客户。

附加资源

通过练习和进一步的学习,你将更加熟练地掌握 HAVING 子句的使用。