テーブル結合のまとめ JOIN SQL

## 用途
SQL文で、異なるテーブルを結合することができる。そこから値を取得できる。

:::note warn
注意
結合方法がいくつかあり、結果が異なる
:::

## 結論
:::note info
**内部結合 (JOIN , INNER JOIN)**
結合する値がない場合、その行は消滅し表示されない。

**外部結合 (OUTER JOIN , LEFT JOIN , RIGHT JOIN , FULL JOIN)**
結合する値がない場合、その行は消滅することなく `NULL` が表示される。
:::

## 使用方法　「内部結合」
### 【JOIN】
:::note info
テーブル①にテーブル②がくっつくイメージ
:::

```sql:sql
SELECT *
  FROM テーブル①
  JOIN テーブル②
  ON 2つのテーブルの結合条件
```

#### 使用するテーブル
`humansテーブル`
| id | name |
|:-----------:|:------------:|
| 1       | Suzuki        |
| 2     | Takahashi      |
| 3       | tanaka        |

`groupsテーブル`
| id | color |human_id|
|:-----------:|:------------:|:------------:|
| 1       | red      |2|
| 2     | green       |1|
| 3       | blue        |3|

```sql:sql
SELECT *
  FROM humans
  JOIN groups
  ON humans.id = groups.human_id
```
### 結果
| id | name | id | color |human_id|
|:-----------:|:------------:|:-----------:|:------------:|:------------:|
| 2     | Takahashi      | 1       | red      |2|
| 1       | Suzuki        |  2     | green       |1|
| 3       | tanaka        | 3       | blue        |3|

humansテーブルのidと、groupsテーブルのhuman_idが紐付いている

### 取得するカラムを指定できる
```sql:sql
SELECT humans.name, groups.color
  FROM humans
  JOIN groups
  ON humans.id = groups.human_id
```
### 結果
| humans.name | groups.color |
|:---------:|:------------:|
| Takahashi |  red     |
| Suzuki | green        |
| tanaka  | blue        |

humansテーブルのidと、groupsテーブルのhuman_idが紐付いて、指定したhumansテーブルのnameとgroupsテーブルのcolorが取得された。

### 【INNER JOIN】
:::note info
【特徴その１】
結合する値がない場合、その行は消滅し表示されない。
【特徴その２】
テーブル②の行数を基準として、行数を表示する。
:::

```sql:sql
SELECT *
  FROM テーブル①
  INNER JOIN テーブル②
  ON 2つのテーブルの結合条件
```
### 【特徴その１】

#### 使用するテーブル
`humansテーブル`
| id | name |
|:-----------:|:------------:|
| 1       | Suzuki        |
| 2     | Takahashi      |
| 3       | tanaka        |

`groupsテーブル`
| id | color |human_id|
|:-----------:|:------------:|:------------:|
| 1       | red      |2|
| 2     | green       |1|

groupsテーブルのhuman_idに３という値がない（humansテーブルのidが３の行と結合する値がない）

```sql:sql
SELECT *
  FROM humans
  INNER JOIN groups
  ON humans.id = groups.human_id
```

### 結果
| id | name | id | color |human_id|
|:-----------:|:------------:|:-----------:|:------------:|:------------:|
| 2     | Takahashi      | 1       | red      |2|
| 1       | Suzuki        |  2     | green       |1|

groupsテーブルのhuman_idに3という値がないから、humansテーブルのidが3の行が消えている

### 【特徴その２】
#### 使用するテーブル
`humansテーブル`
| id | name |
|:-----------:|:------------:|
| 1       | Suzuki        |
| 2     | Takahashi      |
| 3       | tanaka        |

`groupsテーブル`
| id | color |human_id|
|:-----------:|:------------:|:------------:|
| 1       | red      |2|
| 2     | green       |1|
| 3       | blue        |3|
| 4       | yellow        |１|

groupsテーブルのhuman_idに被りがある

```sql:sql
SELECT *
  FROM humans
  INNER JOIN groups
  ON humans.id = groups.human_id
```

### 結果
| id | name | id | color |human_id|
|:-----------:|:------------:|:-----------:|:------------:|:------------:|
| 2     | Takahashi      | 1       | red      |2|
| 1       | Suzuki        |  2     | green       |1|
| 3       | tanaka        | 3       | blue        |3|
| 1       | Suzuki        |  ４     | yellow       |1|

humansテーブルのidとgroupsテーブルのhuman_idが紐付いた値が、4行目に追加された

---------------------------------------

## 使用方法　「外部結合」

### 【OUTER JOIN】
:::note info
【特徴その１】
「INNER JOIN」では結合する値がない場合、その行は消滅し表示されなかったが、「OUTER JOIN」では消滅することなく `NULL` が表示される。
【特徴その２】
「INNER JOIN」と同様、テーブル①の行数を基準としてテーブル②の行数を表示する。
:::
```sql:sql
SELECT *
  FROM テーブル①
  OUTER JOIN テーブル②
  ON 2つのテーブルの結合条件
```

結果は省略します。


### 【LEFT JOIN】 左外部結合
:::note info
テーブル①は全て表示する
値がない場合はNULLを表示する
:::
```sql:sql
SELECT *
  FROM テーブル①
  LEFT JOIN テーブル②
  ON 2つのテーブルの結合条件
```

### 使用するテーブル
`humansテーブル`
| id | name |
|:-----------:|:------------:|
| 1       | Suzuki        |
| 2     | Takahashi      |
| 3       | tanaka        |

`groupsテーブル`
| id | color |human_id|
|:-----------:|:------------:|:------------:|
| 1       | red      |2|
| 2     | green       |1|

```sql:sql
SELECT *
  FROM humans
  LEFT JOIN groups
  ON humans.group_id = groups.id
```
### 結果
| id | name | id | color |human_id|
|:-----------:|:------------:|:-----------:|:------------:|:------------:|
| 2     | Takahashi      | 1       | red      |2|
| 1       | Suzuki        |  2     | green       |1|
| 3       | tanaka        | NULL       | NULL        |NULL|

groupsテーブルのhuman_idに3という値がないから、3行目のgroupsテーブルの値がNULLになっている

### 【RIGHT JOIN】 右外部結合
:::note info
テーブル②は全て表示する(LEFT JOINの逆)
値がない場合はNULLを表示する
:::
```sql:sql
SELECT *
  FROM テーブル①
  RIGHT JOIN テーブル②
  ON 2つのテーブルの結合条件
```


### 使用するテーブル

`humansテーブル`
| id | name |
|:-----------:|:------------:|
| 1       | Suzuki        |
| 2     | Takahashi      |

`groupsテーブル`
| id | color |human_id|
|:-----------:|:------------:|:------------:|
| 1       | red      |2|
| 2     | green       |1|
| 3       | blue        |3|

```sql:sql
SELECT *
  FROM humans
  RIGHT JOIN groups
  ON humans.group_id = groups.id
```
### 結果
| id | name | id | color |human_id|
|:-----------:|:------------:|:-----------:|:------------:|:------------:|
| 2     | Takahashi      | 1       | red      |2|
| 1       | Suzuki        |  2     | green       |1|
| NULL       | NULL        | 3       | blue        |3|

humansテーブルのidに3という値がないから、3行目のhumansテーブルの値がNULLになっている

### 【FULL JOIN】 完全外部結合
:::note info
両テーブルどちらも優先され、結合条件で一致する、しないにかかわらず全て表示する。
:::
```sql:sql
SELECT *
  FROM テーブル①
  FULL JOIN テーブル②
  ON 2つのテーブルの結合条件
```

結果は省略します。

---------------------------------------