HAVING 和 WHERE 都是 SQL 中用于过滤数据的子句,但它们之间有一些关键区别:
-
应用场景:
- WHERE 子句主要用于在 FROM 子句中的表上应用过滤条件。它在分组和聚合操作之前执行,用于过滤源数据。
- HAVING 子句用于在 GROUP BY 子句之后对数据进行过滤。它主要用于对聚合函数(如 COUNT、SUM、AVG 等)的结果进行筛选。
-
使用条件:
- WHERE 子句可以包含任何基于表列的条件,而不仅仅是聚合函数。
- HAVING 子句只能包含基于聚合函数的条件。
-
执行顺序:
- WHERE 子句在 GROUP BY 子句之前执行,用于过滤原始数据。
- HAVING 子句在 GROUP BY 子句之后执行,用于过滤聚合后的数据。
举个例子,假设我们有一个名为 “orders” 的表,其中包含 “customer_id”、“order_date” 和 “amount” 列。
-
使用 WHERE 子句过滤出特定日期范围内的订单:
SELECT * FROM orders WHERE order_date BETWEEN '2021-01-01' AND '2021-12-31';
-
使用 HAVING 子句过滤出订单总金额大于 1000 的客户:
SELECT customer_id, SUM(amount) as total_amount FROM orders GROUP BY customer_id HAVING total_amount > 1000;
总之,WHERE 子句用于过滤原始数据,而 HAVING 子句用于过滤聚合后的数据。这两者在 SQL 查询中的应用场景和执行顺序有所不同。