0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SQLのHAVINGとWHEREについて

Last updated at Posted at 2023-11-22

はじめに

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でも使えないということ。

つまりどういうこと?下記具体例

NG例
SELECT class,SUM(name) as total FROM student
GROUP BY class
HAVING total >= 20;

//うまくいきそうだけどこれはNG
OK例
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で定義したtotalHAVINGを実行する際にはまだ生成されていないということ。
なのでSUM(name)で記述するのが正しい。

結論

このあたりの処理について迷ったら処理順を考えてみて記述の内容を考えてみるように。

▼参考にしたサイト

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?