INNER JOIN、LEFT JOIN、RIGHT JOINの違い

## はじめに
今回はSQLを学び始めた人のためにJOINについて解説いたします。

## JOINとは？
テーブル同士を結合することです。データベースからレコードを取得する際、〇〇テーブルとXXテーブルのレコードを同時に取得したいなぁ...と思う時や、1つのテーブルだけでは情報が足りないから他のテーブルからも情報を引っ張ってこよう！と思うことがあります。そんな時に使うのがJOINです。こんな感じに書きます↓

```sql
SELECT カラム名 
FROM テーブル1 
JOIN テーブル2 ON テーブル1.カラム名1 = テーブル名2.カラム名
```

実例を交えて見ていきましょう！

## JOIN(結合)にもいろいろある
テーブルの結合は大きく分けると内部結合と外部結合に分かれています。どのようにテーブルを結合するかによって、SQLでの記載方法が異なるわけです。また、下記の表のように省略形で記載することもできます。

| 結合方法          |       SQLでの記載方法 |    省略形    |
|:-----------------|------------------:|:------------------:|
| 内部結合          |        INNER JOIN |        JOIN        |
| 外部結合          | LEFT OUTER JOIN <br>または RIGHT OUTER JOIN | LEFT JOIN<br>RIGHT JOIN       |

## INNER JOIN(内部結合)
テーブル同士を内部結合した場合、指定した条件に合致したレコードのみを取り出します。これだけではよくわからないと思うので実例を示します。以下の２つのテーブルに対して、内部結合でレコードを取得してみましょう。

- usersテーブル

| id       |       name |     type_id   |
|:-----------------|------------------:|:------------------:|
| 1             |              キン肉マン |        1        |
| 2           |            悪魔将軍 |       2       |
| 3             |              ザ・マン |        3        |
| 4             |              バッファローマン |        5        |


- typesテーブル

| id       |       type |
|:-----------------|------------------:|
| 1             |              正義超人 |
| 2           |            悪魔超人 |
| 3             |              完璧超人 |
| 4             |              残虐超人 |

- 実行するSQL

```sql
SELECT users.id, users.name, types.type 
FROM users JOIN types ON users.type_id = types.id
```

- 実行結果

| id      |       name |     type   |
|:-----------------|------------------:|:------------------:|
| 1             |              キン肉マン |        正義超人        |
| 2           |            悪魔将軍 |       悪魔超人       |
| 3             |              ザ・マン |        完璧超人|


userテーブル.type_id と typesテーブル.idで内部結合すると、typesテーブル.idに4が存在しないため実行結果にバッファローマンは表示されません。このように、結合可能なレコードが存在しない場合はレコードを取得しないのが内部結合です。

## 左外部結合
続いて左外部結合をみていきましょう。左外部結合をする上で、まず思い浮かぶのは「左って何？」だと思います。これはSQL文でJOINの左側にあるテーブルを指しています。下記の例ではテーブル1ですね。同様に、右外部結合だとJOINの右側にあるテーブルなのでテーブル2を指しています。

```sql
SELECT カラム名 
FROM テーブル1 LEFT JOIN テーブル2 ON テーブル1.カラム名1 = テーブル名2.カラム名
```

それでは先程と同じテーブルを使って左外部結合をしてみましょう。
- 実行するSQL

```sql
SELECT users.id, users.name, types.type 
FROM users LEFT JOIN types ON users.type_id = types.id
```

- 実行結果

| id       |       name |     type   |
|:-----------------|------------------:|:------------------:|
| 1             |              キン肉マン |        正義超人        |
| 2           |            悪魔将軍 |       悪魔超人       |
| 3             |              ザ・マン |        完璧超人        |
| 4             |              バッファローマン |        NULL        |

今回はバッファローマンのレコードが取得できましたね!バッファローマンのtype_idはtypesテーブルのidに存在しませんが、とりあえず取得しちゃうわけです。これが左外部結合です。

## 右外部結合
最後に右外部結合をやってみましょう。左外部結合が分かれば簡単です。
・実行するSQL

```sql
SELECT users.id, users.name, types.type FROM users RIGHT JOIN types ON users.type_id = types.id
```
・実行結果

|id       |       name |     type   |
|:-----------------|------------------:|:------------------:|
| 1             |              キン肉マン |        正義超人        |
| 2           |            悪魔将軍 |       悪魔超人       |
| 3             |              ザ・マン |        完璧超人        |
| NULL             |              NULL |        残虐超人        |

右外部結合だと、typesテーブルから残虐超人のレコードが取得できましたね!残虐超人のidはusersテーブルのtype_idに存在しませんが、左外部結合と同様にとりあえず取得しちゃうわけです。これが右外部結合です。

## まとめ
キン肉マンを読んだことがある人はわかると思いますが、バッファローマンは初登場時は悪魔超人でした。その後改心して正義超人になりましたが、完璧超人始祖編で再び悪魔超人となっています。そしてキン肉マン2世ではなぜか正義超人に戻っていました。そんな背景があり、今回の記事ではバッファローマンの所属する勢力がtypesテーブル上に存在しないことにしたわけです！