ProgrammingSQLアナリスト

SQLにおけるHAVINGとWHEREの違いについて説明してください。それぞれの目的、集約関数との相互作用、使用時の一般的な間違いを回避する方法について。

Hintsage AIアシスタントで面接を突破

回答

WHEREはグループ化や集約の実行前に行をフィルタリングします。つまり、どのレコードがグループ化/集約に入るかを決定します。HAVINGは集約関数を適用した後にグループをフィルタリングします。

  • WHERE:集約関数(SUM、AVGなど)は使用できません。フィルタリングがグループ化の前に行われるためです。
  • HAVING:集約関数を使用できます。フィルタリングがグループ化の後に行われるためです。

例:

-- 雇用されている従業員を除外して、合計給与が50000を超える部門を取得 SELECT department, SUM(salary) as total FROM employees WHERE status = 'active' GROUP BY department HAVING SUM(salary) > 50000;

ここでは:

  • WHERE status = 'active' は退職者を計算前に除外します。
  • HAVING SUM(salary) > 50000 は、合計給与が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はグループ化の後にあり、集約条件に対して使用すべきです。