使用 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 子句返回的行进行操作。 如果查询中的 WHERE 子句后面存在 GROUP BY ... HAVING 部分,则 WHERE 子句将在处理 GROUP BY 之前筛选行,这有可能会限制可以创建的组数量。

在 GROUP BY 后处理 HAVING 子句,且仅对组进行操作,而不是对细节行进行操作。 总结:

  • WHERE 子句会在构成任何组之前筛选行
  • HAVING 子句会筛选整个组,通常查看聚合的结果。