［SQL］テーブル結合時に利用するJOIN句の種類と使い方をとにかく簡単にまとめておく

どんなプロジェクトでも必ず必要になるテーブル結合のSQL。
結合用のJOIN句の種類とレコード取得結果はどうなるんだけっけ...と、記憶があやふやになることがあるので簡単にまとめて備忘録とする。

なお、この記事ではメインで使用する以下3つのJOIN句の情報をまとめています。


<font color="Red">・INNER JOIN</font>
<font color="Red">・LEFT JOIN</font>
<font color="Red">・RIGHT JOIN</font>


# 結合処理の内容をさらっと確認したい人へ
簡単に確認を済ませたい人はこの方のツイート内容がおすすめ。
図を使ってくれているので非常にわかりやすい！
この図を確認した上で以下の文章を読み進めても良いかもです。

[かずなり | 生成AI×ビジネスハック SQL JOINS](https://x.com/MacopeninSUTABA/status/1796452051808833552 "SQL JOINS")


## テーブル例
例として使用するテーブルは以下の2つです。

・userテーブル
・user_orderテーブル(ユーザーの注文を管理するテーブル)


データ内容はこんな感じ

### userテーブル
```sql
mysql> SELECT * FROM user;
+---------+--------+----------+
| user_id | name   | order_id |
+---------+--------+----------+
|       1 | 高橋   |        1 |
|       2 | 山田   |        2 |
|       3 | 青木   |        3 |
|       4 | 井上   |        4 |
|       5 | 澁谷   |        5 |
|       6 | 遠藤   |        6 |
+---------+--------+----------+
```

### user_orderテーブル
```sql
mysql> SELECT * FROM user_order;
+----------+---------+-----------------------------------------+
| order_id | user_id | order_name                              |
+----------+---------+-----------------------------------------+
|        1 |       1 | ビッグマック                               |
|        2 |       2 | チーズバーガー                             |
|        3 |       3 | テリヤキバーガー                           |
|        4 |      10 | フィレオフィッシュバーガー                     |
+----------+---------+-----------------------------------------+
```

なお、今回は全てuserテーブル起点(from user)で考え、JOINに使用するカラムは、
user_orderテーブルの「user_id」カラムとします。


## 1. INNER JOIN 文
```sql
SELECT * FROM
  user 
INNER JOIN 
  user_order 
ON 
  user_order.user_id = user.user_id;
```

### INNER JOINのポイント
<font color="Red">・JOINで指定したカラムの値が一致するレコードのみ出力される</font>

### SQL実行結果

```sql
+---------+--------+----------+----------+---------+--------------------------+
| user_id | name   | order_id | order_id | user_id | order_name               |
+---------+--------+----------+----------+---------+--------------------------+
|       1 | 高橋   |        1 |        1 |       1 | ビッグマック                |
|       2 | 山田   |        2 |        2 |       2 | チーズバーガー              |
|       3 | 青木   |        3 |        3 |       3 | テリヤキバーガー            |
+---------+--------+----------+----------+---------+--------------------------+
```



## 2. LEFT JOIN 文
```sql
SELECT * FROM
  user 
LEFT JOIN 
  user_order 
ON 
  user_order.user_id = user.user_id;
```

### LEFT JOINのポイント
<font color="Red">・from句で指定したテーブル側のレコードは全て出力</font>
<font color="Red">・JOINで指定したカラムの値が一致するレコード → データを連結して出力</font>
<font color="Red">・JOINで指定したカラム値が一致しないレコード → 結合相手(user_order)のテーブルカラム値をnullにして出力</font>

### SQL実行結果

```sql
+---------+--------+----------+----------+---------+--------------------------+
| user_id | name   | order_id | order_id | user_id | order_name               |
+---------+--------+----------+----------+---------+--------------------------+
|       1 | 高橋   |        1 |        1 |       1 | ビッグマック               |
|       2 | 山田   |        2 |        2 |       2 | チーズバーガー              |
|       3 | 青木   |        3 |        3 |       3 | テリヤキバーガー            |
|       4 | 井上   |        4 |     NULL |    NULL | NULL                     |
|       5 | 澁谷   |        5 |     NULL |    NULL | NULL                     |
|       6 | 遠藤   |        6 |     NULL |    NULL | NULL                     |
+---------+--------+----------+----------+---------+--------------------------+
```


## 3. RIGHT JOIN 文
```sql
SELECT * FROM
  user 
RIGHT JOIN 
  user_order 
ON 
  user_order.user_id = user.user_id;
```

### RIGHT JOINのポイント

<font color="Red">・結合相手側(user_order)のテーブルレコードは全て出力</font>
<font color="Red">・JOINで指定したカラムの値が一致するレコード → データを連結して出力</font>
<font color="Red">・JOINで指定したカラム値が一致しないレコード → from句で指定した側のテーブルカラム値をnull状態にして出力</font>

### SQL実行結果
```sql
+---------+--------+----------+----------+---------+-----------------------------+
| user_id | name   | order_id | order_id | user_id | order_name                  |
+---------+--------+----------+----------+---------+-----------------------------+
|       1 | 高橋   |        1 |        1 |       1 | ビッグマック                   |
|       2 | 山田   |        2 |        2 |       2 | チーズバーガー                  |
|       3 | 青木   |        3 |        3 |       3 | テリヤキバーガー                |
|    NULL | NULL   |     NULL |       4 |      10 | フィレオフィッシュバーガー       |
+---------+--------+----------+----------+---------+-----------------------------+
```


以上です！！