【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 出金項目)に対し条件を指定することが可能

まとめ f:id:haru89:20200516163445p:plain:w70

「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