【SQL】WHEREとHAVINGの違い
どちらも絞り込みを行うが、WHEREとHAVINGはなにが違うのか
→ 呼ばれるタイミングが違う
SQLが実行される順序
FROM → WHERE → GROUPBY → HAVING → SELECT → ORDERBY
呼ばれるタイミングが違うとどう変わる?
WHEREとGROUP BYを併用した場合
WHERE → GROUP BYの順でクエリが評価されるため、グループ化された結果に対しWHEREで条件を指定することができない
HAVINGとGROUP BYを利用した場合
GROUP BY → HAVINGの順でクエリが評価されるため、グループ化された結果に対しHAVINGで条件を指定することができる
SQLの実行結果の違いを確認してみる
以下の家計簿テーブルから、出金項目別に出金額合計を取り出す
出金項目 | 出金額 |
---|---|
食費 | 1000 |
光熱費 | 3000 |
交通費 | 3000 |
食費 | 2000 |
交通費 | 1000 |
食費 | 2000 |
交際費 | 0 |
WHEREを使ったSQL例)
SELECT 出金項目, SUM (出金額) AS 出金項目別の出金額合計 FROM 家計簿 WHERE SUM(出金額) > 0 GROUP BY 出金項目
実行結果
-> エラー
WHEREとGROUP BYを併用した場合、WHERE → GROUP BYの順でクエリが評価される。 そのため、グループ化された結果(GROUP BY 出金項目)に対し、WHEREは使えないのでエラーとなる
HAVINGを使ったSQL例)
SELECT 出金項目, SUM (出金額) AS 出金項目別の出金額合計 FROM 家計簿 GROUP BY 出金項目 HAVING SUM(出金額) > 0
実行結果
出金項目 | 出金額 |
---|---|
食費 | 5000 |
光熱費 | 3000 |
交通費 | 4000 |
HAVINGとGROUP BYを利用した場合、GROUP BY → HAVINGの順でクエリが評価される。 そのため、グループ化された結果(GROUP BY 出金項目)に対し条件を指定することが可能
まとめ
「WHERE」と「HAVING」違いは、呼ばれるタイミング(「WHERE」→「GROUP BY」→「HAVING」)にあった。 したがって「GROUP BY」が関わらなければ、同じ結果を得られる。 また、集計関数は対象のデータ数が少ないほど効率性が高まる。集計関数を行う際は、絞り込みの条件に「GROUP BY」が関わらないのであれば、HAVINGではなく、WHEREにより条件を絞り込んでから集計関数を実行することで、SQLの効率性を高めることができる。 WHEREとHAVINGの特性を理解した上で、効率の良いSQLを書くようにしたい。
参考
https://www.atmarkit.co.jp/ait/articles/0706/21/news128.html