WHEREはグループ化や集約の実行前に行をフィルタリングします。つまり、どのレコードがグループ化/集約に入るかを決定します。HAVINGは集約関数を適用した後にグループをフィルタリングします。
例:
-- 雇用されている従業員を除外して、合計給与が50000を超える部門を取得 SELECT department, SUM(salary) as total FROM employees WHERE status = 'active' GROUP BY department HAVING SUM(salary) > 50000;
ここでは:
WHEREで集約関数を使用できますか?
エラー:WHERE SUM(amount) > 100 と書こうとしますが、これは不可能です — 集約関数はHAVINGのみに適用されます。
例(間違い):
SELECT customer_id, SUM(amount) FROM orders WHERE SUM(amount) > 100 GROUP BY customer_id -- ERROR: WHEREでのSUM()の不正な使用
正しい:
SELECT customer_id, SUM(amount) FROM orders GROUP BY customer_id HAVING SUM(amount) > 100;
ストーリー
CRMの開発。WHERE COUNT(order_id) > 5を使って注文数が5を超える顧客をフィルタリングしようとしました。クエリは機能しませんでした。結果:報告書の顧客数が不正確でした。なぜなら、COUNTはWHEREでは使用できないからです。
ストーリー
ビジネスアナリティクス。非アクティブ商品をフィルタリングする代わりにWHEREを使用せずHAVINGを使用しました。結果:"空の"グループの集約と遅いSQL。状況を改善するために、ステータスによるフィルタをWHEREに移しました。
ストーリー
複雑なレポート。HAVINGを使用してGROUP BYなしで個別の行をフィルタリングしました。一部のDBMSではエラーを引き起こし、他のDBMSでは予期しない動作を引き起こします。結論:HAVINGはグループ化の後にあり、集約条件に対して使用すべきです。