【MySQL】JOINは何もの？

# JOINは何もの⁇

社内のSQL勉強会が再開しました。
以前の勉強会で、基本的なSQLを書くことが出来ましたが、
実際、業務にクエリは、少し難しいところがあります。

なので、
今、とこで困っていますか？と言うと、
JOINが分からないです。という返事がきました。

それで、
今回は、JOINについて説明します。

## JOINは…

JOINは、両方のテーブルを結合すること。
各テーブルは、各自に合ったデータを保存していますが、
別のテーブルからデータをインポートするにはJOINする必要があります。

product

| product_no       |       name        |    price           |
|:----------------:|:-----------------:|:------------------:|
| 1                |              A    |        1000        |
| 2                |              B    |       5000         |
| 3                |              C    |        3000        |

stock

| product_no       |       count       |    peceiving date  |
|:----------------:|:-----------------:|:------------------:|
| 1                |              10    |        2019-10-14|
| 2                |              50    |       2019-10-16|
| 3                |              20    |        2019-10-17|

Result

| product_no       |       count       |    price           | product_no       |       count       |    peceiving date  |
|:----------------:|:-----------------:|:------------------:|:----------------:|:-----------------:|:------------------:|
| 1  |    A    |  1000  | 1 | 10 |2019-10-14|
| 2  |    B    |  5000  | 1 | 10 |2019-10-14|
| 3  |    C    |  3000  | 1 | 10 |2019-10-14|
| 1  |    A    |  1000  | 2 | 50 |2019-10-16|
| 2  |    B    |  5000  | 2 | 50 |2019-10-16|
| 3  |    C    |  3000  | 2 | 50 |2019-10-16|
| 1  |    A    |  1000  | 3 | 20 |2019-10-17|
| 2  |    B    |  5000  | 3 | 20 |2019-10-17|
| 3  |    C    |  3000  | 3 | 20 |2019-10-17|


例えば、
上のように二つのテーブルがあります。
これらをJOINして結合します。

でも、問題があります。
AとBのデータ数がそれぞれ3つだったので、
JOINをすると、両方のテーブルを結合して、9つのデータが出ました。

このようにJOINは異なる二つのテーブルを結合することができますが、
演算量が飛躍的に増加してしまいます。
だからDBを設計する際にJOINを避けるためにも、テーブルの数をできるだけ減らすのが良いです。

## JOINの種類

![99219C345BE91A7E32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421654/3a998d79-6651-d2bf-01c6-4ae5c3cc7757.png)

JOINは、色んな種類があります。
そこで、Aテーブルだけ、Bテーブルだけデータをみたい場合は、そもそもJOINする必要がないので、
よく使うJOINを説明します。
もちろん、RIGHT JOINはLEFTの逆なので省略します。

### 1. Cross JOIN
![egaeg.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421654/1f81fcab-1787-cee8-923a-23243c752bc6.jpeg)

先ほど説明した通り、両方のテーブルの積集合を実行するがCross Joinです。
すべてのケースをすべて表現してくれる方法です。


```
SELECT * FROM table1 JOIN table2, ...
```

### 2. Inner JOIN
![fsdgvsfg.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421654/36d03fad-6840-89cf-cb88-2dc8b4d3466a.jpeg)

Inner JOINは、基準テーブルとJoinテーブルの重複した値を示しています。
結果の値は、AのテーブルとBテーブルがすべて持っているデータのみを検索します。

```
SELECT * 
FROM product
INNER JOIN stock
ON product.product_no = stock.product_no;
```

```
SELECT A.price, B.count
FROM product AS A
INNER JOIN stock AS B 
ON A.product_no = B.product_no;
```

product

| product_no       |       name        |    price           |
|:----------------:|:-----------------:|:------------------:|
| 1                |              A    |        1000        |
| 2                |              B    |       5000         |
| 3                |              C    |        3000        |

stock

| product_no       |       count       |    peceiving date  |
|:----------------:|:-----------------:|:------------------:|
| 1                |              10    |        2019-10-14|
| 2                |              50    |       2019-10-16|
| 3                |              20    |        2019-10-17|

Result

| price           | count       |
|:----------------:|:-----------------:|
| 1000  | 10 |
| 5000  | 50 |
| 3000  | 20 |

### 3. LEFT OUTER JOIN

![fgswgf.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421654/067de432-8e60-c0fc-459a-eb32cc718298.jpeg)

基準テーブルの値 + テーブルと基準テーブルの重複した値を示しています。
左側のテーブルに基づいてJOINをします。
その後、結果の値は、AテーブルのすべてのデータとAテーブルとBテーブルの重複する値が出ます。

```
SELECT * 
FROM product
LEFT OUTER JOIN JOIN stock
ON product.product_no = stock.product_no;
```

```
SELECT *
FROM product AS A
LEFT OUTER JOIN stock AS B 
ON A.product_no = B.product_no;
```

product

| product_no       |       name        |    price           |
|:----------------:|:-----------------:|:------------------:|
| 1                |              A    |        1000        |
| 2                |              B    |       5000         |
| 3                |              C    |        3000        |
| 4                |              D    |        2000        |

stock

| product_no       |       count       |    peceiving date  |
|:----------------:|:-----------------:|:------------------:|
| 1                |              10    |        2019-10-14|
| 2                |              50    |       2019-10-16|
| 3                |              20    |        2019-10-17|

Result

| product_no       |       count       |    price           | product_no       |       count       |    peceiving date  |
|:----------------:|:-----------------:|:------------------:|:----------------:|:-----------------:|:------------------:|
| 1  |    A    |  1000  | 1 | 10 |2019-10-14|
| 2  |    B    |  5000  | 1 | 10 |2019-10-14|
| 3  |    C    |  3000  | 1 | 10 |2019-10-14|
| 4  |    D    |  2000  | |  ||


少し、難しいかもしれませんが、
実際、よく使うSQLなので勉強する方が良いと思います。