【コード・出力例あり】MySQLでテーブルを結合する方法【８選】

<br>

MySQLに置いて**テーブル同士の結合方法**を解説していきます。
<br>
<br>

## 用語解説
テーブル名：nameList

<table border=1>
<tr>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>name</td>
<td bgcolor=silver class='medium'>age</td>
<td bgcolor=silver class='medium'>addressId</td>
</tr>

<tr>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Abe</td>
<td class='normal' valign='top'>42</td>
<td class='normal' valign='top'>3</td>
</tr>

<tr>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>31</td>
<td class='normal' valign='top'>2</td>
</tr>

<tr>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Hide</td>
<td class='normal' valign='top'>24</td>
<td class='normal' valign='top'>3</td>
</tr>

<tr>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>39</td>
<td class='normal' valign='top'>1</td>
</tr>
</table>

#### テーブル
表の事。(上記なら nameList というテーブル名。)

#### レコード
表の行の事。(上記なら4つのレコードが存在する。)

#### カラム
表の列の事。(上記なら4つのカラムが存在する。)
<br>
<br>

## テーブル結合について
>※ちょっと小難しい話になりますので、飛ばしても構いません。
読む場合も「そうなんだ〜」程度に留めてもらって大丈夫です。

### 正規化
まずデータベースを設計する段階で、カラムに**重複する情報**がある場合、そのカラムを**別のテーブルに分ける**という事をし、テーブルが保持する<font color=red>**データ量の削減**</font>と<font color=red>**処理の高速化**</font>を図ります。これを`正規化`と言います。
<br>

### 非正規化
`正規化`のようにテーブルを分けて、扱うデータ量を削減するのに対して、重複する値があっても**テーブルを分けず**に、<font color=red>**１つのテーブルでデータをまとめてしまう**</font>という事。これが`非正規化`になります。
<br>

### テーブル結合の意味
`正規化`されたデータは**処理速度を早める**のに対して、まとまったデータの解析や抽出などには向いておりません。その為、データの解析や抽出を行う際は、あえて`非正規化`の状態に戻して、**扱いやすいテーブルの構造**にします。

これがテーブル結合をする意味になります。
<br>
<br>
<br>

## この記事で使用するテーブル
これ以降は指定がない限り、同様のテーブルを利用します。
<br>
テーブル名：nameList

<table border=1>
<tr>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>name</td>
<td bgcolor=silver class='medium'>age</td>
<td bgcolor=silver class='medium'>addressId</td>
</tr>

<tr>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Abe</td>
<td class='normal' valign='top'>42</td>
<td class='normal' valign='top'>3</td>
</tr>

<tr>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>31</td>
<td class='normal' valign='top'>2</td>
</tr>

<tr>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Hide</td>
<td class='normal' valign='top'>24</td>
<td class='normal' valign='top'>3</td>
</tr>

<tr>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>39</td>
<td class='normal' valign='top'>1</td>
</tr>
</table>
<br>

テーブル名：addressList

<table border=1>
<tr>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>address</td>
</tr>

<tr>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Tokyo</td>
</tr>

<tr>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Osaka</td>
</tr>

<tr>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Aichi</td>
</tr>

<tr>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Fukuoka</td>
</tr>
</table>
<br>
<br>



## INNER JOIN(内部結合)
内部結合とは、２つのテーブルで**共通のデータが存在しているレコードのみ抽出**を行います。
実際のコード例はこちら。

```sql
SELECT 
    *
FROM
    nameList 
        INNER JOIN
    addressList ON nameList.addressId = addressList.id;
```
これだけだとわかりにくいと思うので、順を追って解説していきます。

①まず元となるテーブル名を`FROM`で記述。( *nameList* )
②その後ろに`INNER JOIN`を記述。
③結合したいテーブル名を記述。( *addressList* )
④その後ろに`ON`を記述。
⑤同じ情報が入ったカラムをイコールで繋ぐ。
<br>

`SELECT`内に複数のテーブルを指定する事になるので、カラムを指定する際は**どのテーブルのカラムを言っているのか**、テーブル名で指定してやる必要があります。(上記なら *nameList.addressId* と *addressList.id* です)

また、`INNER`は省略して書く事もできますが、**他の人が見た際にわかりやすくするため**に、明示的に記述する事が多いです。
<br>

上記の出力結果はこちら。

<table border=1>
<tr>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>name</td>
<td bgcolor=silver class='medium'>age</td>
<td bgcolor=silver class='medium'>addressId</td>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>address</td>
</tr>

<tr>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>39</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Tokyo</td>
</tr>

<tr>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>31</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Osaka</td>
</tr>

<tr>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Abe</td>
<td class='normal' valign='top'>42</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Aichi</td>
</tr>

<tr>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Hide</td>
<td class='normal' valign='top'>24</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Aichi</td>
</tr>
</table>

 *nameListテーブル* が *addressIdカラム* 順に並び、**隣にあるaddressテーブルのidカラムが対応している**というのが特徴です。
<br>
<br>
<br>

## OUTER JOIN(外部結合)
外部結合とは、２つのテーブルで**共通のデータが存在しているレコード**と、結合させたテーブルで**データが存在しないレコードはNULL**として抽出を行います。

また、外部結合には`RIGHT`と`LEFT`の２種類の結合方法があります。違いは、**左右のテーブルの並び順**です。
<br>
<br>

### RIGHT JOIN
`RIGHT JOIN`で結合したコードはこちらです。

```sql
SELECT 
    *
FROM
    nameList 
        RIGHT JOIN
    addressList ON nameList.addressId = addressList.id;
```

簡単にいうと、先ほどの`INNER JOIN`の部分を`RIGHT JOIN`に書き換えるだけです。
<br>

上記の出力結果はこちら。

<table border=1>
<tr>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>name</td>
<td bgcolor=silver class='medium'>age</td>
<td bgcolor=silver class='medium'>addressId</td>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>address</td>
</tr>

<tr>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Abe</td>
<td class='normal' valign='top'>42</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Aichi</td>
</tr>

<tr>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>31</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Osaka</td>
</tr>

<tr>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Hide</td>
<td class='normal' valign='top'>24</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Aichi</td>
</tr>

<tr>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>39</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Tokyo</td>
</tr>

<tr>
<td class='normal' valign='top'>NULL</td>
<td class='normal' valign='top'>NULL</td>
<td class='normal' valign='top'>NULL</td>
<td class='normal' valign='top'>NULL</td>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Fukuoka</td>
</tr>
</table>

基本的には`INNER JOIN`と同じですが、`RIGHT JOIN`の場合は *nameListテーブル* の *addressIdカラム* に、 *addressListテーブル* の *idカラム* と**対応する値が無い場合**、最後のレコードのように**NULL値を出力してくれる**という点が違いです。
<br>
<br>

### LEFT JOIN
`LEFT JOIN`で結合したコードはこちらです。

```sql
SELECT 
    *
FROM
    nameList 
        LEFT JOIN
    addressList ON nameList.addressId = addressList.id;
```

先程と同じで、`INNER JOIN`の部分を`LEFT JOIN`に書き換えるだけです。
<br>

上記の出力結果はこちら。

<table border=1>
<tr>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>name</td>
<td bgcolor=silver class='medium'>age</td>
<td bgcolor=silver class='medium'>addressId</td>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>address</td>
</tr>

<tr>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>39</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Tokyo</td>
</tr>

<tr>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>31</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Osaka</td>
</tr>

<tr>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Abe</td>
<td class='normal' valign='top'>42</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Aichi</td>
</tr>

<tr>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Hide</td>
<td class='normal' valign='top'>24</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Aichi</td>
</tr>
</table>

`RIGHT JOIN`は**右側にあるテーブルをベース**に、左側のテーブルに無い値をNULL値として出力。
`LEFT JOIN`は**左側にあるテーブルをベース**に、右側のテーブルに無い値をNULL値とします。

今回の例でいうと、左側にある *addressListテーブル* の *idカラム* に、 *nameListテーブル* の *addressIdカラム* で**対応する値が全てある**ので、NULL値の出力はありません。

そのため、こういう場合は`INNER JOIN`と同様の結果になります。
<br>
<br>
<br>

## CROSS JOIN(掛け合わせ)
`CROSS JOIN`とは、左右のテーブルで**組み合わせ可能な全てのレコード**を抽出する事ができます。例えば片方のテーブルで６件のレコード、もう片方のテーブルで４件のレコードが存在する場合、２４件のレコードからなるテーブルが出力されます。

言葉ではわかりにくいと思うので、実際のコードから見ていきましょう。

```sql
SELECT 
    *
FROM
    nameList 
        CROSS JOIN
    addressList;
```

これまで紹介してきた結合と違うのは、`CROSS JOIN`の後に結合したいテーブルを記述した後、**それぞれのテーブルで対応するカラム同士の記述が必要ない**という点です。

<br>

上記の出力結果はこちら。

<table border=1>
<tr>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>name</td>
<td bgcolor=silver class='medium'>age</td>
<td bgcolor=silver class='medium'>addressId</td>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>address</td>
</tr>

<tr>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Abe</td>
<td class='normal' valign='top'>42</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Tokyo</td>
</tr>

<tr>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>31</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Tokyo</td>
</tr>

<tr>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Hide</td>
<td class='normal' valign='top'>24</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Tokyo</td>
</tr>

<tr>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>39</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Tokyo</td>
</tr>

<tr>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Abe</td>
<td class='normal' valign='top'>42</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Osaka</td>
</tr>

<tr>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>31</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Osaka</td>
</tr>

<tr>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Hide</td>
<td class='normal' valign='top'>24</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Osaka</td>
</tr>

<tr>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>39</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Osaka</td>
</tr>

<tr>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Abe</td>
<td class='normal' valign='top'>42</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Aichi</td>
</tr>

<tr>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>31</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Aichi</td>
</tr>

<tr>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Hide</td>
<td class='normal' valign='top'>24</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Aichi</td>
</tr>

<tr>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>39</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Aichi</td>
</tr>

<tr>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Abe</td>
<td class='normal' valign='top'>42</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Fukuoka</td>
</tr>

<tr>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>31</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Fukuoka</td>
</tr>

<tr>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Hide</td>
<td class='normal' valign='top'>24</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Fukuoka</td>
</tr>

<tr>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>39</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Fukuoka</td>
</tr>
</table>

 *nameListテーブル* のレコードは４件、 *addressListテーブル* のレコードも４件。したがって、全ての組み合わせを表示すると、

4レコード * 4レコード = 16レコード

という出力結果になります。
<br>
<br>

#### 補足
因みに`CROSS JOIN`で、それぞれのテーブルで**対応するカラム同士の記述をした場合**は、`INNER JOIN`と同じ出力結果になります。
実際に記述してみた例がこちら。

```sql
SELECT 
    *
FROM
    nameList 
        CROSS JOIN
    addressList ON nameList.addressId = addressList.id;
```
<br>
上記を実行すると、下記の出力結果のように、`INNER JOIN`で内部結合した結果と同じになります。

<table border=1>
<tr>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>name</td>
<td bgcolor=silver class='medium'>age</td>
<td bgcolor=silver class='medium'>addressId</td>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>address</td>
</tr>

<tr>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>39</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Tokyo</td>
</tr>

<tr>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>31</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Osaka</td>
</tr>

<tr>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Abe</td>
<td class='normal' valign='top'>42</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Aichi</td>
</tr>

<tr>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Hide</td>
<td class='normal' valign='top'>24</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Aichi</td>
</tr>
</table>

<br>
<br>
<br>

## SELF JOIN(同じテーブルの結合)
`SELF JOIN`とは、**同じテーブル同士を連結**させて抽出する事ができます。

こちらでは、以下のテーブルを利用します。
(住所ではなく家族関係を示すカラムとして、 *addressIdカラム* を *familyIdカラム* に変更。)

<br>

テーブル名：nameList

<table border=1>
<tr>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>name</td>
<td bgcolor=silver class='medium'>age</td>
<td bgcolor=silver class='medium'>familyId</td>
</tr>

<tr>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Abe</td>
<td class='normal' valign='top'>42</td>
<td class='normal' valign='top'>3</td>
</tr>

<tr>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>31</td>
<td class='normal' valign='top'>2</td>
</tr>

<tr>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Hide</td>
<td class='normal' valign='top'>24</td>
<td class='normal' valign='top'>3</td>
</tr>

<tr>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>39</td>
<td class='normal' valign='top'>1</td>
</tr>
</table>
<br>

では`SELF JOIN`する際の、実際のコードはこちら。

```sql
SELECT 
    *
FROM
    nameList nL1
        JOIN
    nameList nL2 ON nL1.familyId = nL2.id;
```

`SELF JOIN`というクエリは無いので、代わりに`JOIN(INNER JOIN)`を利用します。`ON`以下でカラム同士の関係を表す際は、**どちらのテーブルのカラムを指しているのか指定**するために、テーブル名を記述した後に`エイリアス(別名設定)`を付けています。
<br>

では上記の出力結果はこちら。

<table border=1>
<tr>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>name</td>
<td bgcolor=silver class='medium'>age</td>
<td bgcolor=silver class='medium'>familyId</td>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>name</td>
<td bgcolor=silver class='medium'>age</td>
<td bgcolor=silver class='medium'>addressId</td>
</tr>

<tr>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>39</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Abe</td>
<td class='normal' valign='top'>42</td>
<td class='normal' valign='top'>3</td>
</tr>

<tr>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>31</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>31</td>
<td class='normal' valign='top'>2</td>
</tr>

<tr>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Abe</td>
<td class='normal' valign='top'>42</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Hide</td>
<td class='normal' valign='top'>24</td>
<td class='normal' valign='top'>3</td>
</tr>

<tr>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Hide</td>
<td class='normal' valign='top'>24</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Hide</td>
<td class='normal' valign='top'>24</td>
<td class='normal' valign='top'>3</td>
</tr>
</table>

このように、同じテーブル同士のテーブル結合もできます。

>`ON`以下でカラム同士の関係を逆にすると、左右のテーブルが入れ替わり、なんの為のテーブル結合かわかりにくくなるので、注意が必要です。

<br>
<br>
<br>

## ３つ以上のテーブル結合
３つ以上のテーブルを結合する場合は、**テーブルの数だけ`JOIN`の記述する**というやり方になります。

例えば、何らかの理由で *nameListテーブル* に *addressListテーブル* を結合し、さらに *nameListテーブル* を結合するとします。その際のコードがこちら。

```sql
SELECT 
	*
FROM
    nameList nL1
        INNER JOIN
    addressList aL ON nL1.id = aL.id
        INNER JOIN
    nameList nL2 ON aL.id = nL2.id;
```
<br>

上記の出力結果はこちら。

<table border=1>
<tr>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>name</td>
<td bgcolor=silver class='medium'>age</td>
<td bgcolor=silver class='medium'>addressId</td>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>address</td>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>name</td>
<td bgcolor=silver class='medium'>age</td>
<td bgcolor=silver class='medium'>addressId</td>
</tr>

<tr>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Abe</td>
<td class='normal' valign='top'>42</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Tokyo</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Abe</td>
<td class='normal' valign='top'>42</td>
<td class='normal' valign='top'>3</td>
</tr>

<tr>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>31</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Osaka</td>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>31</td>
<td class='normal' valign='top'>2</td>
</tr>

<tr>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Hide</td>
<td class='normal' valign='top'>24</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Aichi</td>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Hide</td>
<td class='normal' valign='top'>24</td>
<td class='normal' valign='top'>3</td>
</tr>

<tr>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>39</td>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Fukuoka</td>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>39</td>
<td class='normal' valign='top'>1</td>
</tr>
</table>

このように、３つ以上のテーブルの結合もできます。

>ここでは省略しますが、`RIGHT JOIN`や`LEFT JOIN`などと組み合わせて、利用する事もできます。

<br>
<br>
<br>

## UNION(縦結合)
今まで解説してきたテーブルは、全て横に結合するものでしたが、`UNION`を利用すれば**テーブル同士を縦に結合して抽出する事**が可能です。

また縦の結合には、`UNION`と`UNION ALL`という２種類の結合方法があります。違いは、**重複しているレコードを抽出するかしないか**です。
<br>
<br>

### UNION
まずは実際のコードを見ていきましょう。

```sql
SELECT 
    *
FROM
    nameList
WHERE
    id >= 3
UNION SELECT 
    *
FROM
    nameList
WHERE
    id <= 2;
```

特徴的なのは、`SELECT`で作成したテーブル同士を、`UNION`で**記述ごと結合させている部分**です。
<br>

解説すると、`UNION`の前にある記述は、 *nameListテーブル* から *idカラム* が**３以上**のレコードを取得。

<table border=1>
<tr>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>name</td>
<td bgcolor=silver class='medium'>age</td>
<td bgcolor=silver class='medium'>addressId</td>
</tr>

<tr>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Hide</td>
<td class='normal' valign='top'>24</td>
<td class='normal' valign='top'>3</td>
</tr>

<tr>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>39</td>
<td class='normal' valign='top'>1</td>
</tr>
</table>
<br>

`UNION`の後にある記述は、 *nameListテーブル* から *idカラム* が**２以下**のレコードを取得。

<table border=1>
<tr>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>name</td>
<td bgcolor=silver class='medium'>age</td>
<td bgcolor=silver class='medium'>addressId</td>
</tr>

<tr>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Abe</td>
<td class='normal' valign='top'>42</td>
<td class='normal' valign='top'>3</td>
</tr>

<tr>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>31</td>
<td class='normal' valign='top'>2</td>
</tr>
</table>
<br>

そして、**上記２つのテーブルを縦に結合する**という流れです。
実際の出力結果はこちらです。

<table border=1>
<tr>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>name</td>
<td bgcolor=silver class='medium'>age</td>
<td bgcolor=silver class='medium'>addressId</td>
</tr>

<tr>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Hide</td>
<td class='normal' valign='top'>24</td>
<td class='normal' valign='top'>3</td>
</tr>

<tr>
<td class='normal' valign='top'>4</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>39</td>
<td class='normal' valign='top'>1</td>
</tr>

<tr>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Abe</td>
<td class='normal' valign='top'>42</td>
<td class='normal' valign='top'>3</td>
</tr>

<tr>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>31</td>
<td class='normal' valign='top'>2</td>
</tr>
</table>
<br>

また、`UNION`には**重複したレコードは出力しない**、という特徴があります。
例えば以下のコード。

```sql
SELECT 
    *
FROM
    nameList
WHERE
    id <= 3
UNION SELECT 
    *
FROM
    nameList
WHERE
    id <= 2;
```
<br>

こちらの出力結果はこのようになります。

<table border=1>
<tr>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>name</td>
<td bgcolor=silver class='medium'>age</td>
<td bgcolor=silver class='medium'>addressId</td>
</tr>

<tr>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Abe</td>
<td class='normal' valign='top'>42</td>
<td class='normal' valign='top'>3</td>
</tr>

<tr>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>31</td>
<td class='normal' valign='top'>2</td>
</tr>

<tr>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Hide</td>
<td class='normal' valign='top'>24</td>
<td class='normal' valign='top'>3</td>
</tr>
</table>

さらに、ここでは紹介しませんが、**別のテーブル同士での結合も可能**です。
その際にカラムとして出力されるのは、**同じカラム名とデータ型を持ったカラムのみ**になります。
<br>
<br>

### UNION ALL
`UNION`は**重複するレコードを削除する**のに対して、`UNION ALL`は**重複するレコードも抽出**を行います。
例えば、先ほどのコードを`UNION ALL`に変えたのがこちら。

```sql
SELECT 
    *
FROM
    nameList
WHERE
    id <= 3
UNION ALL SELECT 
    *
FROM
    nameList
WHERE
    id <= 2;
```
特徴としては、`UNION`の後に`ALL`を付け加えただけです。
<br>

上記の出力結果がこちらです。

<table border=1>
<tr>
<td bgcolor=silver class='medium'>id</td>
<td bgcolor=silver class='medium'>name</td>
<td bgcolor=silver class='medium'>age</td>
<td bgcolor=silver class='medium'>addressId</td>
</tr>

<tr>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Abe</td>
<td class='normal' valign='top'>42</td>
<td class='normal' valign='top'>3</td>
</tr>

<tr>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>31</td>
<td class='normal' valign='top'>2</td>
</tr>

<tr>
<td class='normal' valign='top'>3</td>
<td class='normal' valign='top'>Hide</td>
<td class='normal' valign='top'>24</td>
<td class='normal' valign='top'>3</td>
</tr>

<tr>
<td class='normal' valign='top'>1</td>
<td class='normal' valign='top'>Abe</td>
<td class='normal' valign='top'>42</td>
<td class='normal' valign='top'>3</td>
</tr>

<tr>
<td class='normal' valign='top'>2</td>
<td class='normal' valign='top'>Ide</td>
<td class='normal' valign='top'>31</td>
<td class='normal' valign='top'>2</td>
</tr>
</table>

このように`UNION ALL`では、**重複したレコードも抽出**を行うことが可能です。
その他の機能や注意事項は、`UNION`で解説したものと同様です。

<br>
<br>
<br>

## まとめ
以上が`MySQL`における、テーブルの結合方法になります。

ある程度使いこなせるようになれば、さらに`WHERE`や`GROUP BY`、`ORDER BY`などと組み合わせて、**自由自在にデータの抽出が行える**ようになります。

また興味のある方は実際に`MySQL`をインストールして、`MySQL Workbench`というGUIアプリを利用すれば、簡単に同じ事ができるので、ぜひ試してみてください。

最後まで読んでいただき、ありがとうございました！

<br>
<br>
<br>

筆者：yuki｜学習10日目で初案件獲得→現在はフルスタックエンジニア転職に向けて学習中
Qiita：https://qiita.com/yuki4839
Twitter：https://twitter.com/yuki35522891