使用 HAVING 筛选组
使用 GROUP BY 子句创建组后,可以进一步筛选结果。 HAVING 子句充当组的筛选器。 这类似于 WHERE 子句充当 FROM 子句返回的行的筛选器的方式。
使用 HAVING 子句可以创建搜索条件,从概念上类似于 WHERE 子句的谓词,然后测试 GROUP BY 子句返回的每个组。
以下示例对每个客户的订单进行计数,并筛选结果以仅包括已下达 10 个订单的客户:
SELECT CustomerID,
COUNT(*) AS OrderCount
FROM Sales.SalesOrderHeader
GROUP BY CustomerID
HAVING COUNT(*) > 10;
将 HAVING 与 WHERE 进行比较
虽然 HAVING 和 WHERE 子句都筛选数据,但请记住 WHERE 对 FROM 子句返回的行进行作。 如果 GROUP BY...WHERE 子句在查询中存在 HAVING 节,WHERE 子句将在处理 GROUP BY 之前筛选行,这可能会限制可以创建的组。
在 GROUP BY 之后处理 HAVING 子句,并且仅对组执行作,而不是对详细信息行进行作。 总结:
- WHERE 子句在形成任何组之前筛选行
- HAVING 子句会筛选整个组,通常查看聚合的结果。