Quantcast
Channel: 初心者タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 21081

【HAVING句】#6 Webディレクター見習いが知識ゼロからSQLを学ぶ

$
0
0

こんにちは!  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

numberareateam_namepoints
01東京スマイル2
02大阪たこ焼き3
03東京乃木坂1
04福岡わんちーむ3
05大阪しらんけど7
06東京ガールズ43
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

numberareateam_namepoints
01東京スマイル2
02大阪たこ焼き3
03東京乃木坂1
04福岡わんちーむ3
05大阪しらんけど7
06東京ガールズ43
07愛知しゃちほこ4
SELECTarea,AVG(points)AS平均得点FROMquiz_2WHEREarea='東京'GROUPBYarea;
SELECTarea,AVG(points)AS平均得点FROMquiz_2GROUPBYareaHAVINGarea='東京';

どちらのクエリを実行しても、結果としては下記のようにareaカラムが東京の平均得点を求めることが出来ます。

area平均得点
東京2

このようにどちらでも記述可能なのですが、SELECT文の処理の順番の関係で、WHERE句で絞ることが出来るものはWHERE句での絞り込みが推奨されます。

なになに!いきなり、順番なんて覚えれないよ!
って思った方、安心してください
SELECT句以外は記述した順に上から処理されていくので、SELECT句の位置だけ覚えれば大丈夫です!

表にまとめると以下の通りになります。

記述順処理順
SELECT15
FROM21
WHERE32
GROUP BY43
HAVING54
ORDER BY66
LIMIT77

このように、HAVING句よりも先にWHERE句が処理されるため、
結果が同じになる場合は、WHERE句に記述するほうが早い段階でデータ量が削減されることになります。
データ量が多いと、記述順によるシステム処理の差が大きくなるためWHERE句への記述を優先するんですね。

まとめ

  • HAVING句GROUP BY句でグループ化した結果に対し、データを絞り込むために使用する
  • HAVING句にはCOUNT関数などの集約関数を書くことが出来るが、WHERE句には書くことができない
  • WHERE句でもHAVING句でも書くことが出来る場合はWHERE句に記述する

最後に

今回はHAVING句に関してまとめてみました!
最近はちゃんと、それぞれの句での処理後のデータをイメージしながら記述するようにしています(゜゜)
(今まで何も考えずに書いてたのがバレますね、、><笑)
ではまた次回!

記事一覧


Viewing all articles
Browse latest Browse all 21081

Trending Articles