SQLデータ分析入門#5『集計関数を理解する』

[SQLデータ分析入門#4『LIMIT句を理解する』 - Qiita](https://qiita.com/piyoSakai/items/131553cbc40ac357477f)
の続き

# 本記事のスコープ
- あるテーブルのあるカラムについて、合計・カウント・平均を出せるようにする
- その時、「集計関数」と「GROUP BY 句」が(基本的に)ニコイチなことを理解する

# 集計関数とは
- レコードを集計したいときに使う関数
- 例えば、合計はSUM()関数、平均はCOUNT()関数を使う
- その時「何毎に集計したいのか」(例えば、性別ごと、日付ごと)を指定するのが「GROUP BY 句」

※ 今後「hogehoge()」と書いたら、頭のなかで「hogehoge関数」と読み替えてください
※ 関数とは、ある作業を勝手にやってくれる魔法の呪文、くらいに考えておいてください。

# 例えば
こんなテーブルがあったときの実行結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/d8a14513-5820-863f-2430-8db5139902d9.png)

## 全ユーザの身長の平均を知りたい
```SQL
SELECT AVG(身長)
FROM User
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/43df3890-b79e-459f-39da-0bda654fbc28.png)

## 男女別に、全ユーザの身長の平均を知りたい
```SQL
SELECT
   性別
   , AVG(身長)
FROM User
GROUP BY 性別 -- 性別で分類するという宣言
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/2abc45bc-2e4d-b7c1-70ca-c105484d03c9.png)

GROUP BY はかんたんにこのようにも書ける。実行結果は一緒

```SQL
SELECT
   性別
   , AVG(身長)
FROM User
GROUP BY 1 -- 「SELECT」の一番最初の項目、すなわち性別で分類するという宣言
```

## 男女、出身別に、全ユーザの身長の平均と人数を知りたい
```SQL
SELECT
   性別
   , 出身
   , AVG(身長)
   , COUNT(*) -- レコード数を数える
FROM User
GROUP BY 1, 2 -- 「SELECT」の1つめと2つめの項目で分類する宣言
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/1d37a166-0a63-3af7-ea16-33d30f2b3b63.png)

※ 唐突に出てきた「null」は「何も情報が入っていない」という意味、分析上「不明」として扱うことが多い

## 男性に絞って、出身別に平均身長が知りたい
```SQL
SELECT
   出身
   , AVG(身長)
   , COUNT(*) -- レコード数を数える
FROM User
WHERE 性別 = "m"
GROUP BY 1
```
<img width="302" alt="スクリーンショット 2018-01-05 22.27.56.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/214098/c04e69b5-eddb-b397-858e-6ecd4c0748a0.jpeg">

# ～句、順番のルール
～句の順番は決まっていて、例えば、

```SQL
SELECT
   出身
   , AVG(身長)
GROUP BY 1
FROM User
WHERE 性別 = "m"
```

のようにはかけないのでこの順番は守るべし。

1. SELECT
1. FROM
1. WHERE
1. GROUP BY
1. HAVING
1. ORDER BY
1. LIMIT

※ HAVINGはこの入門シリーズでは解説しない、ORDER BYは次章で解説する


# 推薦図書
よくあるSQL本はエンジニア向けなのですが、この本は分析をしたいだけの人に向いてます。
<a href="https://www.amazon.co.jp/10%E5%B9%B4%E6%88%A6%E3%81%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E5%85%A5%E9%96%80-SQL%E3%82%92%E6%AD%A6%E5%99%A8%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E6%B4%BB%E7%94%A8%E6%99%82%E4%BB%A3%E3%82%92%E7%94%9F%E3%81%8D%E6%8A%9C%E3%81%8F-Informatics-IDEA-%E9%9D%92%E6%9C%A8/dp/4797376279/ref=as_li_ss_il?ie=UTF8&qid=1529821989&sr=8-1&keywords=10%E5%B9%B4%E6%88%A6%E3%81%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E5%85%A5%E9%96%80&linkCode=li2&tag=t11378rs0f-22&linkId=904d97de322a8c31a37e518e1ef2a7a8" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4797376279&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=t11378rs0f-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=t11378rs0f-22&l=li2&o=9&a=4797376279" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

# 前後の記事
[SQLデータ分析入門#1『SQLってなんだ』 - Qiita](https://qiita.com/piyoSakai/items/926b8f46b08c4a9d439a)
[SQLデータ分析入門#2『SELECT ~ FROM ~ を理解する』 - Qiita](https://qiita.com/piyoSakai/items/b001eac8e0981244be39)
[SQLデータ分析入門#3『WHERE句を理解する』 - Qiita](https://qiita.com/piyoSakai/items/44bc21178349103e2d45)
[SQLデータ分析入門#4『LIMIT句を理解する』 - Qiita](https://qiita.com/piyoSakai/items/131553cbc40ac357477f)
[SQLデータ分析入門#5『集計関数を理解する』 - Qiita](https://qiita.com/piyoSakai/items/16214cd50e28386c97ed)
[SQLデータ分析入門#6『結果の順番をいい感じにする』 - Qiita](https://qiita.com/piyoSakai/items/6008c62a88554a44eb2a)
[SQLデータ分析入門#7『複数のテーブルにまたがって集計する』 - Qiita](https://qiita.com/piyoSakai/items/84bd688b4e4db2148193)
[SQLデータ分析入門#8『基本的な関数を知る』 - Qiita](https://qiita.com/piyoSakai/items/f79869a5b60ab7e8c3b2)