3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【MySQL】JOINは何もの?

Posted at

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

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

1. Cross JOIN

egaeg.JPG

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

SELECT * FROM table1 JOIN table2, ...

2. Inner JOIN

fsdgvsfg.JPG

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

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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?