SQLの複数テーブル結合（JOIN）の使い方と結果

ここでは、実際の例を交えながら、SQLの複数テーブル結合（JOIN）の使い方と結果がどのようになるかを説明します。ここでは、以下の2つのテーブルを例にとります。

---

### サンプルテーブルの準備

**【顧客テーブル】**

| 顧客ID | 名前  |
| ------ | ----- |
| 1      | 田中  |
| 2      | 鈴木  |
| 3      | 佐藤  |

**【注文テーブル】**

| 注文ID | 顧客ID | 商品             |
| ------ | ------ | ---------------- |
| 101    | 1      | パソコン         |
| 102    | 1      | プリンター       |
| 103    | 3      | スマートフォン   |
| 104    | 4      | タブレット       |

※注文テーブルでは、顧客IDが「4」の注文がありますが、顧客テーブルには顧客ID「4」のデータは存在しません。

---

### 1. INNER JOIN（内部結合）の例

**ポイント：**  
両方のテーブルで**一致するデータだけ**を取得します。  
つまり、顧客テーブルと注文テーブルの両方に存在する顧客IDで結合します。

**SQL例：**

```sql
SELECT 顧客.顧客ID, 顧客.名前, 注文.注文ID, 注文.商品
FROM 顧客
INNER JOIN 注文 ON 顧客.顧客ID = 注文.顧客ID;
```

**結果：**

| 顧客ID | 名前  | 注文ID | 商品           |
| ------ | ----- | ------ | -------------- |
| 1      | 田中  | 101    | パソコン       |
| 1      | 田中  | 102    | プリンター     |
| 3      | 佐藤  | 103    | スマートフォン |

**解説：**  
- 顧客ID「1」と「3」は両テーブルに存在するので、その組み合わせが返ります。  
- 顧客ID「2」は注文がないため結果に含まれず、注文テーブルの顧客ID「4」も顧客テーブルにないので除外されます。

---

### 2. LEFT OUTER JOIN（左外部結合）の例

**ポイント：**  
左側（FROM句で指定した）テーブルの全レコードを必ず取得し、右側のテーブルと一致すれば情報を結合。一致しない場合は右側の列がNULLになります。

**SQL例：**

```sql
SELECT 顧客.顧客ID, 顧客.名前, 注文.注文ID, 注文.商品
FROM 顧客
LEFT OUTER JOIN 注文 ON 顧客.顧客ID = 注文.顧客ID;
```

**結果：**

| 顧客ID | 名前  | 注文ID | 商品           |
| ------ | ----- | ------ | -------------- |
| 1      | 田中  | 101    | パソコン       |
| 1      | 田中  | 102    | プリンター     |
| 2      | 鈴木  | NULL   | NULL           |
| 3      | 佐藤  | 103    | スマートフォン |

**解説：**  
- 顧客テーブルの全レコード（1, 2, 3）が返されます。  
- 顧客ID「2」は注文がないので、注文IDと商品がNULLになります。

---

### 3. RIGHT OUTER JOIN（右外部結合）の例

**ポイント：**  
右側のテーブルの全レコードを必ず取得し、左側と一致すれば情報を結合。一致しない場合は左側の列がNULLになります。

**SQL例：**

```sql
SELECT 顧客.顧客ID, 顧客.名前, 注文.注文ID, 注文.商品
FROM 顧客
RIGHT OUTER JOIN 注文 ON 顧客.顧客ID = 注文.顧客ID;
```

**結果：**

| 顧客ID | 名前  | 注文ID | 商品           |
| ------ | ----- | ------ | -------------- |
| 1      | 田中  | 101    | パソコン       |
| 1      | 田中  | 102    | プリンター     |
| 3      | 佐藤  | 103    | スマートフォン |
| NULL   | NULL  | 104    | タブレット     |

**解説：**  
- 注文テーブルの全レコード（101, 102, 103, 104）が返されます。  
- 注文ID「104」は顧客テーブルに存在しないため、顧客IDと名前はNULLとなります。

---

### 4. FULL OUTER JOIN（完全外部結合）の例

**ポイント：**  
両方のテーブルの全レコードを取得します。どちらか一方にしかない場合、その側はNULLになります。

**SQL例：**

```sql
SELECT 顧客.顧客ID, 顧客.名前, 注文.注文ID, 注文.商品
FROM 顧客
FULL OUTER JOIN 注文 ON 顧客.顧客ID = 注文.顧客ID;
```

**結果：**

| 顧客ID | 名前  | 注文ID | 商品           |
| ------ | ----- | ------ | -------------- |
| 1      | 田中  | 101    | パソコン       |
| 1      | 田中  | 102    | プリンター     |
| 2      | 鈴木  | NULL   | NULL           |
| 3      | 佐藤  | 103    | スマートフォン |
| NULL   | NULL  | 104    | タブレット     |

**解説：**  
- 顧客テーブル（顧客ID「1,2,3」）と注文テーブル（注文ID「101,102,103,104」）の全レコードが結果に含まれます。  
- 一方にしかない場合、対応する列がNULLになります。

---

### まとめ

- **INNER JOIN:** 両テーブルに共通するデータだけを返す。  
  _例：顧客とその注文が両方に存在する場合のみ表示。_
- **LEFT OUTER JOIN:** 左側のテーブル（ここでは顧客）の全レコードを返し、右側（注文）の一致するデータを結合。一致しない場合はNULL。  
  _例：全顧客を表示し、注文があれば情報を表示。_
- **RIGHT OUTER JOIN:** 右側のテーブル（注文）の全レコードを返し、左側（顧客）の一致するデータを結合。一致しない場合はNULL。  
  _例：全注文を表示し、顧客情報がなければNULLとなる。_
- **FULL OUTER JOIN:** 両方のテーブルの全レコードを返す。一方だけの場合はその側の列がNULL。  
  _例：顧客と注文のどちらか一方だけのデータも含む。_

---

これらの例をもとに、自分のデータやニーズに合わせてJOINを使い分けると、効率的に必要な情報を抽出できるようになります。実際にSQLを実行して結果を確認しながら、どのJOINがどのような出力になるかを体験してみると理解が深まるでしょう。