【GROUP BY句】＃5 Webディレクター見習いが知識ゼロからSQLを学ぶ

こんにちは! 　saku-chanです!
このアカウントは、社会人1年目のWebディレクター見習い(初心者)がSQLを学ぶ成長記録になっています。
ひよっこから成長する過程を残し、ついでに皆さんからアドバイスを頂けたら良いな! 私と同じように知識ゼロからSQLを始める人の一つの指針になればいいな!という思いで作成しました。
ちなみに、ブログを含め記事などを書いた経験がないため読みづらい部分も多々あるかと思いますが、そこも含めて皆さまアドバイス頂けると嬉しいですmm

◆記事の内容は、**SQL初心者の自分が、同じような初心者の方でも理解しやすいように心がけながら、SQLの基本に関して学んだことを懇切丁寧に**記載しています◆

##目次
- [はじめに](https://qiita.com/saku-chan/items/951d36e75bfce3fbcb1f#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)
- [GROUP BY句とは](https://qiita.com/saku-chan/items/951d36e75bfce3fbcb1f#group-by%E5%8F%A5%E3%81%A8%E3%81%AF)
<br>└[GROUP BY句を使うときの注意点](https://qiita.com/saku-chan/items/951d36e75bfce3fbcb1f#group-by%E5%8F%A5%E3%82%92%E4%BD%BF%E3%81%86%E3%81%A8%E3%81%8D%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9)
- [まとめ](https://qiita.com/saku-chan/items/951d36e75bfce3fbcb1f#%E3%81%BE%E3%81%A8%E3%82%81)
- [最後に](https://qiita.com/saku-chan/items/951d36e75bfce3fbcb1f#%E6%9C%80%E5%BE%8C%E3%81%AB)

##はじめに
今回はSQLのSELECT文を構成する`GROUP BY句`について勉強したことを記載します！
初めてSQLを勉強する方(プログラミング経験自体がなくてもOK)が気軽に読んでいただける記事になっています^^
ではスタート!

⇒[前回の記事【WHERE句】はこちら](/saku-chan/items/9cfe22decee081848772)
⇒[前々回の記事【集約関数】はこちら](/saku-chan/items/71bfa462d8a1384e2965)

⇒[記事一覧](/saku-chan/items/48d36b6ad60d63206a18)

##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|

例えば、areaごとの平均pointsを知りたい時、
下記のようにクエリを記述します。

```sql
SELECT area,
　　　　AVG(points) AS 平均得点 
FROM quiz_2 
GROUP BY area;
```

結果は下記の通りです。

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

areaに分けて、それぞれのエリアの平均pointsを求めることが出来ました!
(東京の場合、(2+1+3)÷3=2のような感じです。)
また、以前の記事でも触れましたが、`AS`を使用することでカラム名を変更することが出来ます。

###GROUP BY句を使うときの注意点
`GROUP BY句`を使うときの注意点は、`GROUP BY句`を使用する時、
`SELECT句`には、**`GROUP BY句`で使用したカラム名**または**集約関数**しか記載することができません。

どういうことかというと、たとえば下記のようなクエリはエラーになります。

```sql
SELECT area,team_name
FROM quiz_2 
GROUP BY area;
```

なぜなら、GROUP BY句でareaごとに絞ると、
東京、大阪、福岡、愛知
に分類されますが、SELECT句で指定したチーム名(team_name)が東京には3種類、大阪には2種類存在してしまっているためです。
1つのareaに対してteam_nameカラムにそれぞれどの値をいれれば良いかプログラムが困ってしまうということですね。

ちなみに集約関数はいくつでも記載できます。
以下に例を記載します!

Table名：quiz_2

|number|area | team_name|points|
|:-------------:|:-------------:|:------------:|:------------:|
|01| 東京| スマイル |2|
|02| 大阪|  たこ焼き |3|
|03|  東京 |  乃木坂 |1|
|04| 福岡 |  わんちーむ  |3|
|05|大阪 | しらんけど|7|
|06|  東京 |  ガールズ4 |3|
|07| 愛知| しゃちほこ  |4|

```sql
SELECT area,
　　　　AVG(points) AS 平均得点,
　　　　MAX(points) AS 最高得点,
       MIN(points) AS 最低得点
FROM quiz_2 
GROUP BY area;
```
このようなクエリを実行すると、下記のような結果を得ることが出来ます。

|area |平均得点|最高得点|最低得点|
|:-------------:|:-------------:|:-------------:|:-------------:|
| 東京|2|3|1|
| 大阪|5|7|3|
| 福岡|3|3|3|
| 愛知| 4|4|4|

`GROUP BY句`で指定した値に対して集約関数がそれぞれ1行ずつ値を返すことが出来るので、エラーにならずにデータを抽出することが出来るんですね。

##まとめ
- `GROUP BY句`は行をいくつかのグループに分割して、それぞれのグループに対して集約関数を使用することが出来る
- `GROUP BY句`を使用する時、
`SELECT句`には、**`GROUP BY句`で使用したカラム名**または**集約関数**しか記載することが出来ない。

##最後に
今回は`GROUP BY句`について記事を書いてみました。
`GROUP BY句`を使ってエラーになる時はたいていSELECT句にGROUP BY句で使用していないカラム名を書いちゃったときな気がします、、(笑)
落ち着いてそれぞれの句で何をしているのか考えてみるのが大切ですね><
ではまた次回!

⇒[記事一覧](/saku-chan/items/48d36b6ad60d63206a18)