はじめに
SQLの勉強をしているときに、
HAVINGとWHEREの使い分けについて疑問を抱き、解消したので備忘録としてまとめる。
どちらも条件を追加するために使う
HAVINGとWHEREはどちらもSQL文で条件を追加するために使う。
じゃあどっちかでいいじゃん!でも決定的な違いがある。
HAVINGとWHEREは処理順が違う
1,FROM
2,WHERE
3,GROUP BY
4,HAVING
5,SELECT
6,ORDER BY
例えば、GROUP BYした後の合算値に対して条件を追加したい場合
WHERE文だとGROUP BYより前に読まれてしまうので、使えない。
そういう時にHAVINGが使える。
SELECTって前に記述するのに意外と読み込まれるの遅い
処理順を見るとSELECTは最後の仕上げみたいな場所にいる。
(ORDER BYはなんとなく最後の仕上げ感はある)
ここで私が学習教材の不正解から抜け出せなかった罠があり...
それはSELECT文でAS句で定義した変数はWHEREでもHAVINGでも使えないということ。
つまりどういうこと?下記具体例
SELECT class,SUM(name) as total FROM student
GROUP BY class
HAVING total >= 20;
//うまくいきそうだけどこれはNG例
SELECT class,SUM(name) as total FROM student
GROUP BY class
HAVING SUM(name) >= 20;
よく考えたら当たり前のこと、でも初めは?で頭がいっぱい。
ここで処理順をもう一度復習。
1,FROM
2,WHERE
3,GROUP BY
4,HAVING
5,SELECT
6,ORDER BY
そう、HAVINGを実行する際にはまだSELECTが読まれていないので
SELECTで定義した変数は使えないということ。
つまりSELECTで定義したtotal
はHAVING
を実行する際にはまだ生成されていないということ。
なのでSUM(name)
で記述するのが正しい。
結論
このあたりの処理について迷ったら処理順を考えてみて記述の内容を考えてみるように。
▼参考にしたサイト