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 が処理される前に行をフィルター処理します。これにより、作成できるグループが制限される可能性があります。
HAVING 句は GROUP BY の後に処理され、詳細行ではなくグループに対して操作を行うだけになります。 まとめ
- WHERE 句を使用すると、グループが作成される前に行がフィルター処理されます。
- HAVING 句を使用すると、グループ全体がフィルター処理され、通常は集計の結果に対して操作が行われます。