こんにちは! saku-chanです!
このアカウントは、社会人1年目のWebディレクター見習い(初心者)がSQLを学ぶ成長記録になっています。
ひよっこから成長する過程を残し、ついでに皆さんからアドバイスを頂けたら良いな! 私と同じように知識ゼロからSQLを始める人の一つの指針になればいいな!という思いで作成しました。
ちなみに、ブログを含め記事などを書いた経験がないため読みづらい部分も多々あるかと思いますが、そこも含めて皆さまアドバイス頂けると嬉しいですmm
◆記事の内容は、SQL初心者の自分が、同じような初心者の方でも理解しやすいように心がけながら、SQLの基本に関して学んだことを懇切丁寧に記載しています◆
目次
はじめに
今回はSQLのSELECT文で使用されるHAVING句
に関して勉強したことを記載します!
HAVING句は自分が結構混乱した句なので、自分がつまづいた点を意識しながら、書いていければと思います。
初めてSQLを勉強する方が気軽に読んでいただける記事になっていますよ^^
ではスタート!
⇒前回の記事【GROUP BY句】はこちら
⇒前々回の記事【WHERE句】はこちら
⇒記事一覧
HAVING句とは
HAVING句
とはなんでしょうか?HAVING句
はGROUP BY句
でグループ化した結果に対し、データを絞り込むために使用します。
まずは前回の記事で書いたGROUP BY句
を使ってデータを分類してみます。
使用するテーブルとクエリは以下の通りです。
Table名:quiz_2
number | area | team_name | points |
---|---|---|---|
01 | 東京 | スマイル | 2 |
02 | 大阪 | たこ焼き | 3 |
03 | 東京 | 乃木坂 | 1 |
04 | 福岡 | わんちーむ | 3 |
05 | 大阪 | しらんけど | 7 |
06 | 東京 | ガールズ4 | 3 |
07 | 愛知 | しゃちほこ | 4 |
SELECTarea, AVG(points)AS平均得点FROMquiz_2GROUPBYarea;
このクエリの実行結果は下記のようになります。
area | 平均得点 |
---|---|
東京 | 2 |
大阪 | 5 |
福岡 | 3 |
愛知 | 4 |
areaに分けて、それぞれのエリアの平均得点を求めることが出来ていますね。
ここまでは前回のおさらいでした。
では、今回は新たにHAVING句
を使用してさらにデータを絞り込んでみます。
SELECTareaAS地域,AVG(points)AS高得点FROMquiz_2GROUPBYareaHAVINGAVG(points)>=4;
このクエリを実行すると、先ほどの結果から、さらに平均得点が4点以上のもののみに絞ることが出来ます。
地域 | 高得点 |
---|---|
大阪 | 5 |
愛知 | 4 |
このようにHAVING句
とGROUP BY句
を使用することでより複雑な絞り込みを行うことが出来るんですね!
さあここで少し不思議に思われた方がいるかもしれません。
あれ? 行を絞り込むための句ってもう1つあったよね?
そうなんです!WHERE句
も行を絞り込むために使われるものでした。
この部分で自分は混乱してしまったので、丁寧に解説していきたいと思います。
HAVING句とWHERE句の違い
まず結論からお伝えすると、HAVING句
にはCOUNT関数などの集約関数を書くことが出来ますが、WHERE句
には書くことができません。
また、内容によってはWHERE句
でもHAVING句
でも書くことが出来る場合がありますが、その場合はWHERE句
に書くのがベターです。
たとえば、WHERE句
でもHAVING句
でも書くことが出来る場合に下記のような場合があります。
Table名:quiz_2
number | area | team_name | points |
---|---|---|---|
01 | 東京 | スマイル | 2 |
02 | 大阪 | たこ焼き | 3 |
03 | 東京 | 乃木坂 | 1 |
04 | 福岡 | わんちーむ | 3 |
05 | 大阪 | しらんけど | 7 |
06 | 東京 | ガールズ4 | 3 |
07 | 愛知 | しゃちほこ | 4 |
SELECTarea,AVG(points)AS平均得点FROMquiz_2WHEREarea='東京'GROUPBYarea;
SELECTarea,AVG(points)AS平均得点FROMquiz_2GROUPBYareaHAVINGarea='東京';
どちらのクエリを実行しても、結果としては下記のようにareaカラムが東京の平均得点を求めることが出来ます。
area | 平均得点 |
---|---|
東京 | 2 |
このようにどちらでも記述可能なのですが、SELECT文の処理の順番の関係で、WHERE句
で絞ることが出来るものはWHERE句
での絞り込みが推奨されます。
なになに!いきなり、順番なんて覚えれないよ!
って思った方、安心してください
SELECT句以外は記述した順に上から処理されていくので、SELECT句の位置だけ覚えれば大丈夫です!
表にまとめると以下の通りになります。
句 | 記述順 | 処理順 |
---|---|---|
SELECT | 1 | 5 |
FROM | 2 | 1 |
WHERE | 3 | 2 |
GROUP BY | 4 | 3 |
HAVING | 5 | 4 |
ORDER BY | 6 | 6 |
LIMIT | 7 | 7 |
このように、HAVING句
よりも先にWHERE句
が処理されるため、
結果が同じになる場合は、WHERE句
に記述するほうが早い段階でデータ量が削減されることになります。
データ量が多いと、記述順によるシステム処理の差が大きくなるためWHERE句
への記述を優先するんですね。
まとめ
HAVING句
はGROUP BY句
でグループ化した結果に対し、データを絞り込むために使用するHAVING句
にはCOUNT関数などの集約関数を書くことが出来るが、WHERE句
には書くことができないWHERE句
でもHAVING句
でも書くことが出来る場合はWHERE句
に記述する
最後に
今回はHAVING句
に関してまとめてみました!
最近はちゃんと、それぞれの句での処理後のデータをイメージしながら記述するようにしています(゜゜)
(今まで何も考えずに書いてたのがバレますね、、><笑)
ではまた次回!
⇒記事一覧