SQL勉強会第二回:これで完璧テーブル結合!!

# イントロ
営業戦略を立てる上で顧客データや行動を知るのは大事ですよね。僕の勤めている会社でも営業の方から〇〇のデータが欲しい、xxの現状を知りたいとお願いされることがあります。今回はそんな営業の方達が簡単なデータなら自分たちでいつでも調べられるように、社内で営業向けSQL勉強会を開いた際の手順を投稿させていただきます。

今回は社内勉強会第二回開催しますので、この記事は第二回目の勉強会内容について投稿しています。

# 今回の目標
テーブル結合を習得すること
前回のSELECT文が把握した上で、関連性があるの複数テーブルからデータを検索して取得できるように

前回勉強会の詳細をご覧ください:
https://qiita.com/TakaoSone/items/34abf475ead31e48b985


# 勉強会の進め方
以下の手順で勉強会を進めました。
1. 前回の内容を復習
2. 復習課題
3. テーブル結合(JOIN)の説明
4. 練習課題
<br>


# 前回の内容を復習
- SQLの基本概念について
(テーブル/ レコード/カラム/データベース)
<img width="791" alt="スクリーンショット 2019-03-14 19.10.04.png (121.9 kB)" src="https://img.esa.io/uploads/production/attachments/8579/2019/03/14/42432/2db977b8-aa1f-4f40-b729-872dbee695e9.png">

<br>

# 復習課題
- データの取得: SELECT, FROM

SELECTは取得したいカラムを指定します。
FROMは取得したいデータがあるテーブルを指定します。

今データベースの中で、usersテーブルとpostsテーブルが存在している

   【 usersテーブル】
<img width="576" alt="スクリーンショット 2019-03-14 17.24.47.png (113.5 kB)" src="https://img.esa.io/uploads/production/attachments/8579/2019/03/14/42432/e2365b19-7d2f-4d28-9251-4d3f1ecdc0da.png">

   【 postsテーブル】
<img width="603" alt="スクリーンショット 2019-03-14 17.26.49.png (139.3 kB)" src="https://img.esa.io/uploads/production/attachments/8579/2019/03/14/42432/c6f92bfa-79c5-49df-bc72-805365cc126c.png">

- 復習：
usersテーブルのidとnameを取得する

```
   SELECT id, name FROM users;
```

3. postsテーブルのidを取得する
4. postsテーブルのidとnameを取得する
<br>


# テーブル結合(JOIN)の説明
「結合」は複数のテーブルをひっつけるという意味です。複数のテーブルを結合して、１つの結果にまとめたいときに使います。

「両方のテーブルにある行」のみを取り出して結合することを内部結合と言います。

```
SELECT テーブル名1.フィールド名, テーブル名2.フィールド名 

FROM テーブル名1

JOIN テーブル名2

ON テーブル名1.フィールド名 = テーブル名2.フィールド名;
```

流れを簡単に説明すると、

**SELECT**に続けて、どのテーブルのどのフィールドデータをそれぞれ取り出すのかということを「テーブル名.フィールド名」で明示し、「,」で区切っていきます。

それから**FROM**で結合の基準となるテーブル名を書き、**JOIN**でもう一方のテーブル名を書きます。

最後に、**ON**で各テーブルのどのフィールドを基準に紐づくのかを=で繋いで書きます。

 【 usersテーブル】
<img width="576" alt="スクリーンショット 2019-03-14 17.24.47.png (113.5 kB)" src="https://img.esa.io/uploads/production/attachments/8579/2019/03/14/42432/e2365b19-7d2f-4d28-9251-4d3f1ecdc0da.png">

   【 postsテーブル】
<img width="603" alt="スクリーンショット 2019-03-14 17.26.49.png (139.3 kB)" src="https://img.esa.io/uploads/production/attachments/8579/2019/03/14/42432/c6f92bfa-79c5-49df-bc72-805365cc126c.png">


  【 user_informationテーブル】
<img width="600" alt="スクリーンショット 2019-03-14 16.33.27.png (117.4 kB)" src="https://img.esa.io/uploads/production/attachments/8579/2019/03/14/42432/c5f155cb-a5cb-47ba-b08c-c9c1f56dcdf2.png">

### 例：
「usersテーブル」のユーザー名nameと「user_informationテーブル」のユーザー趣味hobbyを両方撮りたい時、
まずこんな感じて書いてみよう：

```
SELECT users.name,user_information.hobby FROM users 
```

エラーになりましたね。。
じゃ、次はuser_informationテーブルを繋げるようにJOINしてみましょう。

```
SELECT users.name,user_information.hobby FROM users 
inner join user_information
```
なんか結果おかしいですね。。

オッケー、最後、どんな条件どんなフィールドを基準に二つのテーブルを繋いてるを確認して、onの中で書きましょう。最後セミコロンを忘れないようにご注意してください！

```
SELECT users.name, user_information.hobby FROM users 
inner join user_information on (users.id = user_information.user_id);
```

こんな感じでデータを取れましたね！〜
<img width="330" alt="スクリーンショット 2019-03-14 18.21.13.png (66.4 kB)" src="https://img.esa.io/uploads/production/attachments/8579/2019/03/14/42432/a5407dde-bd67-4427-ab1d-702c1f1f50e9.png">
<br>


# 練習課題
- 1.  usersテーブルのpost_id,nameを取得する

```
SELECT users.post_id, users.name FROM users;
```
<br>

***
- 2. usersテーブルのpost_id,nameとpostsテーブルのcommentsを取得する。
条件: usersテーブルのpost_idとpostsテーブルのidは一致している

```
SELECT users.post_id, users.name, posts.comments FROM users 
JOIN posts on (users.post_id = posts.id);
```
<br>

***
- 3. usersテーブルのpost_id,nameとpostsテーブルの「created」を取得する。
条件: usersテーブルのpost_idとpostsテーブルのidは一致している

```
SELECT users.post_id, users.name, posts.created FROM users 
JOIN posts on (users.post_id = posts.id);
```
<br>

***
- 4. usersテーブルのid,nameとuser_informationテーブルの「revenue」を取得する。
条件: usersテーブルのidとuser_informationテーブルのuser_idは一致している

```
SELECT users.id, users.name, user_information.revenue FROM users 
JOIN user_information on (users.id = user_information.user_id);
```
<br>

***
- 5.  usersテーブルのid,nameとuser_informationテーブルの「revenue」「hobby」を取得する。
条件: usersテーブルのidとuser_informationテーブルのuser_idは一致している

```
SELECT users.id, users.name, user_information.revenue, user_information.hobby FROM users 
JOIN user_information on (users.id = user_information.user_id);
```
<br>

***
- 6. usersテーブルのid,nameとuser_informationテーブルの「revenue」とpostsテーブルのcommentsを取得する。
条件: usersテーブルのidとuser_informationテーブルのuser_idは一致している
            usersテーブルのpost_idとpostsテーブルのidは一致している

```
SELECT users.id, users.name, user_information.revenue, posts.comments from users 
JOIN user_information on (users.id = user_information.user_id)
JOIN posts on (users.post_id = posts.id);
```