【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の種類

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

1. Cross JOIN

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

SELECT * FROM table1 JOIN table2, ...

2. Inner JOIN

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

基準テーブルの値 + テーブルと基準テーブルの重複した値を示しています。
左側のテーブルに基づいて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なので勉強する方が良いと思います。