SQLデータ分析入門#7『複数のテーブルにまたがって集計する』

[SQLデータ分析入門#6『結果の順番をいい感じにする』 - Qiita](https://qiita.com/piyoSakai/items/6008c62a88554a44eb2a)
の続き

# スコープ
- テーブル同士をくっつけて集計できるようになる
- 具体的には、「LEFT JOIN」を学ぶ
- その際に必要となる「ON句」もマスターする

なお、「LEFT JOIN」で殆どの集計ができることから、意図的に他のJOINはスコープ外に置きます。
他には「INNER JOIN」「CROSS JOIN」「OUTER JOIN」などがあるので、興味があれば調べてください。

# その前に
Excelと違って、データベースはテーブル数を贅沢に使って情報を貯めることが多いです。

例えばこのような内容を、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/e0e777e1-e9ac-c098-be6a-91fcd694ee10.png)

このように格納しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/7011a51e-3bdf-b94a-7118-2466d32c5c8e.png)

このように、各テーブルが、データを重複なく持っているような状態を「正規化」されていると言います。
詳しくは、[データベース正規化 | リレーショナルデータベースのテーブル設計をする上で必要な知識。](http://www.fellow-ship.com/tech/normalization.html)が詳しいです。

なお、このように正規化されたDBを、テーブル間が相互に関係をもっていることから、
リレーショナル・データベース(RDB)といい、この状態から集計するために「LEFT JOIN」は大変重要です。

# 基本構造
```SQL
テーブル①
LEFT JOIN テーブル② ON テーブル①のカラム = テーブル②のカラム
```

とすると、テーブル①にテーブル②がくっつきます。
例を見たほうが早いです。

# 例えば
こんなテーブルがあったとき、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/048b026f-5761-afd4-b664-52ebaa0f9f17.png)

Premium_UserテーブルにIDがある人を課金ユーザとした上で、

## 課金ユーザの身長・性別が知りたい

```SQL
SELECT *
FROM
   Premium_User pu
   LEFT JOIN Profile p ON pu.user_id = p.user_id
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/63e4ac47-3c78-0dbc-d397-a390a7f4ef18.png)

```Premium_User pu```はPremium_Userというテーブルにpuというあだ名(alias名)を付けるという意味で、
```Profile p```も同様にpというあだ名がつけられています

それを踏まえて、FROMの中を見てみると、

```SQL
Premium_User pu
LEFT JOIN Profile p ON pu.user_id = p.user_id
```

これは、
「Premium_UserにProfileをくっつけます。」
「その時、puのユーザIDとpのユーザIDが等しいもの同士でくっつけてください」
という意味です。

その結果、こんなくっつき方をしました。
なお、Profileのくっつける先がなかったレコードは無視されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/d4f09f65-fcc8-a46d-f557-992d7cfb0a66.png)

## 課金ユーザの人数と、平均身長がしりたい
では、集計関数も組み合わせてつかってみましょう。FROMの中は変わりません。

```SQL
SELECT COUNT(*), AVG(p.身長)
FROM
   Premium_User pu
   LEFT JOIN Profile p ON pu.user_id = p.user_id
GROUP BY 1
```

結果はこうなります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/bde0a4d6-1cce-523b-7ed0-73f9ae95161f.png)

すこし複雑になってきましたが、JOINを使うなど、複雑なことをして集計する場合は、
集計まえのテーブルのイメージを持つことが大事です。

FROMのなかに、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/63e4ac47-3c78-0dbc-d397-a390a7f4ef18.png)
がいるから、集計すると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/bde0a4d6-1cce-523b-7ed0-73f9ae95161f.png)
こうなるな、というイメージを持ってください。


# 推薦図書
よくある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)