跳到主要内容

SQL WHERE 与 HAVING

在 SQL 中,WHEREHAVING 是两个常用的子句,用于过滤查询结果。虽然它们的功能相似,但它们的应用场景和用法有所不同。本文将详细介绍 WHEREHAVING 的区别,并通过实际案例帮助你更好地理解它们的用法。

1. 什么是 WHERE 和 HAVING?

WHERE 子句

WHERE 子句用于在查询中过滤行数据。它通常用于 SELECTUPDATEDELETE 语句中,用于指定条件,只有满足条件的行才会被包含在结果集中。

HAVING 子句

HAVING 子句用于在聚合查询中过滤分组后的数据。它通常与 GROUP BY 子句一起使用,用于对分组后的结果进行条件过滤。

2. WHERE 与 HAVING 的区别

应用场景

  • WHERE 用于过滤行数据,适用于非聚合查询。
  • HAVING 用于过滤分组后的数据,适用于聚合查询。

执行顺序

  • WHERE 在数据分组之前执行,过滤掉不符合条件的行。
  • HAVING 在数据分组之后执行,过滤掉不符合条件的分组。

3. 代码示例

示例 1:使用 WHERE 过滤行数据

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

order_idcustomer_idamount
1101100
2102200
3101150
4103300

我们想要查询 customer_id 为 101 的所有订单:

sql
SELECT * FROM orders WHERE customer_id = 101;

输出结果:

order_idcustomer_idamount
1101100
3101150

示例 2:使用 HAVING 过滤分组数据

现在,我们想要查询每个客户的订单总金额,并且只显示总金额大于 200 的客户:

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

输出结果:

customer_idtotal_amount
102200
103300
备注

注意:在这个例子中,HAVING 子句用于过滤分组后的结果,只显示总金额大于 200 的客户。

4. 实际应用场景

场景 1:电商平台订单分析

假设你在一家电商平台工作,需要分析客户的购买行为。你可以使用 WHERE 子句来筛选特定时间段的订单,然后使用 HAVING 子句来筛选出购买金额超过一定阈值的客户。

sql
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY customer_id
HAVING SUM(amount) > 1000;

场景 2:学生成绩统计

假设你是一名教师,需要统计每个班级的平均成绩,并且只显示平均成绩超过 80 分的班级。

sql
SELECT class_id, AVG(score) AS average_score
FROM students
GROUP BY class_id
HAVING AVG(score) > 80;

5. 总结

  • WHERE 子句用于过滤行数据,适用于非聚合查询。
  • HAVING 子句用于过滤分组后的数据,适用于聚合查询。
  • WHERE 在数据分组之前执行,而 HAVING 在数据分组之后执行。

通过合理使用 WHEREHAVING,你可以更灵活地过滤和查询数据,满足不同的业务需求。

6. 附加资源与练习

练习 1

尝试编写一个 SQL 查询,从 orders 表中筛选出 customer_id 为 102 且订单金额大于 150 的订单。

练习 2

编写一个 SQL 查询,从 students 表中统计每个班级的最高成绩,并且只显示最高成绩超过 90 分的班级。

附加资源

通过不断练习和查阅文档,你将更加熟练地掌握 WHEREHAVING 的使用方法。