LoginSignup
0
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-02-25

こんにちは!  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
SELECT area,
    AVG(points) AS 平均得点 
FROM quiz_2 
GROUP BY area;

このクエリの実行結果は下記のようになります。

area 平均得点
東京 2
大阪 5
福岡 3
愛知 4

areaに分けて、それぞれのエリアの平均得点を求めることが出来ていますね。
ここまでは前回のおさらいでした。

では、今回は新たにHAVING句を使用してさらにデータを絞り込んでみます。

SELECT area AS 地域,
       AVG(points) AS 高得点
FROM quiz_2 
GROUP BY area
HAVING  AVG(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
SELECT area,
       AVG(points) AS 平均得点
FROM quiz_2 
WHERE area = '東京'
GROUP BY area
;
SELECT area,
       AVG(points) AS 平均得点
FROM quiz_2 
GROUP BY area
HAVING  area = '東京' ;

どちらのクエリを実行しても、結果としては下記のように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句に関してまとめてみました!
最近はちゃんと、それぞれの句での処理後のデータをイメージしながら記述するようにしています(゜゜)
(今まで何も考えずに書いてたのがバレますね、、><笑)
ではまた次回!

記事一覧

0
1
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
1