SQL 複数のテーブルを結合する

# 目的

- 複数のテーブルを結合する際の公文をまとめる。

# 例

- 何かしらのデータが格納されているテーブルA テーブルB テーブルCが存在すると過程する。
- テーブルAにテーブルBとテーブルCを結合し、データを取得する方法の例を下記に記載する。

```sql
select 出力するカラム
from テーブルA
join テーブルB
on テーブルAとテーブルBの結合条件
join テーブルC
on テーブルAとテーブルCの結合条件;
```

# 具体例1

- ユーザのid、名前、年齢層のid、結婚の有無のidのデータが格納されるusersテーブルと年齢層のidと年齢層を紐づけるage_rangesテーブルと、結婚の有無のidと結婚の有無の文字列情報を紐づけるmarriagesテーブルが存在していると過程する。
- 下記にテーブルの詳細情報を記載する。
    - usersテーブル

        | カラム名 | 格納される値の情報 |
        | --- | --- |
        | id | 数値が自動インクリメントされて格納される |
        | name | ユーザ名を表す文字列 |
        | age_renge_id | ユーザの年齢層を識別するID |
        | marriage_id | ユーザの結婚の有無を識別するID |

    - age_rengesテーブル
    
        | カラム名 | 格納される値の情報 |
        | --- | --- |
        | id | 数値が自動インクリメントされて格納される |
        | age_range | 年齢層を指定する文字列(２０代など) |

    - marriagesテーブル
    
        | カラム名 | 格納される値の情報 |
        | --- | --- |
        | id | 数値が自動インクリメントされて格納される |
        | marriage | 既婚か未婚かの文字列 |

- 下記の様にダミーデータが格納されている物とする。
    - usersテーブル

        | id | name | age_renge_id | marriage_id |
        | --- | --- | --- | --- |
        | 1 | miriwo | 2 | 1 |

    - age_rengesテーブル
    
        | id | age_renge |
        | --- | --- |
        | 1 | 未成年 |
        | 2 | 20代 |
        | 3 | 30代 |

    - marriagesテーブル
    
        | id | marriage |
        | --- | --- |
        | 1 | 未婚 |
        | 2 | 既婚 |

- select文でusersテーブルの情報のみをまずは取得してみる。
    - 下記を実行してusersテーブルのidが１のレコードの全てのカラムのデータを出力する。

        ```sql
        select *
        from users
        where id = 1;
        ```
    - 先のSQLにてuserの情報を得ることができたが、年齢層と結婚の有無がidで格納されているためこの結果だけでは正確な情報を得ることはできない。年齢層、結婚の有無も文字列として表示する場合は三つのテーブルを結合する。
    - 年齢層、結婚の有無を日本語の文字列で表示する際は下記を実行する。(出力するカラムはusersテーブルのidカラム、　usersテーブルのnameカラム、age_rangesテーブルのage_rengeカラム、marriagesテーブルのmarriageカラム)

        ```sql
        select users.id, users.name, age_ranges.age_range, marriages.marriage 
        from users
        join age_ranges
        on users.age_renge_id = age_ranges.id
        join marriages
        on users.marriage_id = marriages.id 
        where id = 1;
        ```
    - データ参照のイメージを下記に記載する

        <img width="833" alt="無題のスプレッドシート_-_Google_スプレッドシート.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/9ecf5712-ca68-b78f-8466-38542e01240d.png">


# 具体例2 

- ユーザのid、名前が格納されているusersテーブルとユーザとキーワードidを紐づけるkeywordsテーブルと、キーワードidとキーワード文字列紐づけるkeyword_contentsテーブルが存在していると過程する。
- 下記にテーブルの詳細情報を記載する。
    - usersテーブル

        | カラム名 | 格納される値の情報 |
        | --- | --- |
        | id | 数値が自動インクリメントされて格納される |
        | name | ユーザ名を表す文字列 |

    - keywordsテーブル
    
        | カラム名 | 格納される値の情報 |
        | --- | --- |
        | id | 数値が自動インクリメントされて格納される |
        | user_id | ユーザのidが格納されている |
        | keyword_id | キーワードのidが格納されている |

    - keyword_contentsテーブル
    
        | カラム名 | 格納される値の情報 |
        | --- | --- |
        | id | 数値が自動インクリメントされて格納される |
        | keyword | キーワードの文字列 |

- 下記の様にダミーデータが格納されている物とする。
    - usersテーブル

        | id | name |
        | --- | --- |
        | 1 | miriwo |

    - keywordsテーブル
    
        | id | user_id | keyword_id |
        | --- | --- | --- |
        | 1 | 1 | 1 |
        | 2 | 1 | 2 |
        | 3 | 1 | 5 |

    - keyword_contentsテーブル
    
        | id | keyword |
        | --- | --- |
        | 1 | 熱帯魚 |
        | 2 | PHP |
        | 3 | 釣り |
        | 4 | アウトドア |
        | 5 | DIY |


- ユーザ情報とキーワードの情報を出力する際は下記を実行する。(出力するカラムはusersテーブルのidカラム、　usersテーブルのnameカラム、keyword_contentsテーブルのkeywordカラム、usersテーブルのidカラムとnameカラムは重複して表示されるが正常名動作である。)

        ```sql
        select users.id, users.name, keyword_contents.keyword
        from users
        join keyrowds
        on users.id = keyrowds.user_id
        join keyrowd_contents
        on keyrowds.keyword_id = keyrowd_contents.id 
        where id = 1;
        ```
    - データ参照時のイメージを下記に記載する。

        <img width="528" alt="無題のスプレッドシート_-_Google_スプレッドシート.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/efd2c854-7d23-f319-fcae-6488a3dea723.png">