Closed10
SQL Join を可視化する
- 参考資料
- join types
- INNER JOIN
- LEFT JOIN
- RIGHT JOIN
- OUTER JOIN
- LEFT JOIN EXCLUDING INNER JOIN
- RIGHT JOIN EXCLUDING INNER JOIN
- OUTER JOIN EXCLUDING INNER JOIN
- サンプルテーブル
table a
pk | value
----+------------
1 | FOX
2 | COP
3 | TAXI
4 | LINCOLN
5 | ARIZONA
6 | WASHINGTON
7 | DELL
10 | LUCENT
(8 rows)
table b
pk | value
----+-----------
1 | TROT
2 | CAR
3 | CAB
6 | MONUMENT
7 | PC
8 | MICROSOFT
9 | APPLE
11 | SCOTCH
(8 rows)
- 準備
psql -h localhost -U postgres -W -c "create database a;"
(pwd)1234
export PQ_URL_A='postgres://postgres:1234@localhost:5432/a?sslmode=disable'
psql -h localhost -U postgres -W -c "create database b;"
(pwd)1234
export PQ_URL_B='postgres://postgres:1234@localhost:5432/b?sslmode=disable'
INNER JOIN
- 可視化
- SQL
SELECT <select_list>
FROM a
INNER JOIN b
ON a.Key = b.Key
- サンプル
select a.pk as a_pk, a.value as a_value,
b.value as b_value, b.pk as b_pk
from a
inner join b
on a.pk = b.pk;
a_pk | a_value | b_value | b_pk
------+------------+----------+------
1 | FOX | TROT | 1
2 | COP | CAR | 2
3 | TAXI | CAB | 3
6 | WASHINGTON | MONUMENT | 6
7 | DELL | PC | 7
(5 rows)
LEFT JOIN
- 可視化
- SQL
SELECT <select_list>
FROM a
LEFT JOIN b
ON a.Key = b.Key
- サンプル
select a.pk as a_pk, a.value as a_value,
b.value as b_value, b.pk as b_pk
from a
left join b
on a.pk = b.pk;
a_pk | a_value | b_value | b_pk
------+------------+----------+------
1 | FOX | TROT | 1
2 | COP | CAR | 2
3 | TAXI | CAB | 3
4 | LINCOLN | |
5 | ARIZONA | |
6 | WASHINGTON | MONUMENT | 6
7 | DELL | PC | 7
10 | LUCENT | |
(8 rows)
RIGHT JOIN
- 可視化
- SQL
SELECT <select_list>
FROM a
RIGHT JOIN b
ON a.Key = b.Key
- サンプル
select a.pk as a_pk, a.value as a_value,
b.value as b_value, b.pk as b_pk
from a
right join b
on a.pk = b.pk;
a_pk | a_value | b_value | b_pk
------+------------+-----------+------
1 | FOX | TROT | 1
2 | COP | CAR | 2
3 | TAXI | CAB | 3
6 | WASHINGTON | MONUMENT | 6
7 | DELL | PC | 7
| | MICROSOFT | 8
| | APPLE | 9
| | SCOTCH | 11
(8 rows)
OUTER JOIN
- 可視化
- SQL
SELECT <select_list>
FROM a
FULL OUTER JOIN b
ON a.Key = b.Key
- サンプル
select a.pk as a_pk, a.value as a_value,
b.value as b_value, b.pk as b_pk
from a
full outer join b
on a.pk = b.pk;
a_pk | a_value | b_value | b_pk
------+------------+-----------+------
1 | FOX | TROT | 1
2 | COP | CAR | 2
3 | TAXI | CAB | 3
4 | LINCOLN | |
5 | ARIZONA | |
6 | WASHINGTON | MONUMENT | 6
7 | DELL | PC | 7
| | MICROSOFT | 8
| | APPLE | 9
10 | LUCENT | |
| | SCOTCH | 11
(11 rows)
LEFT EXCLUDING JOIN
-
可視化
-
SQL
SELECT <select_list>
FROM a
LEFT JOIN b
ON a.Key = b.Key
WHERE b.Key IS NULL
- サンプル
select a.pk as a_pk, a.value as a_value,
b.value as b_value, b.pk as b_pk
from a
left join b
on a.pk = b.pk
where b.pk is null;
a_pk | a_value | b_value | b_pk
------+---------+---------+------
5 | ARIZONA | |
4 | LINCOLN | |
10 | LUCENT | |
(3 rows)
RIGHT EXCLUDING JOIN
- 可視化
- SQL
SELECT <select_list>
FROM a
RIGHT JOIN b
ON a.Key = b.Key
WHERE a.Key IS NULL
- サンプル
select a.pk as a_pk, a.value as a_value,
b.value as b_value, b.pk as b_pk
from a
right join b
on a.pk = b.pk
where a.pk is null;
a_pk | a_value | b_value | b_pk
------+---------+-----------+------
| | MICROSOFT | 8
| | APPLE | 9
| | SCOTCH | 11
(3 rows)
RIGHT EXCLUDING JOIN
- 可視化
- SQL
SELECT <select_list>
FROM a
FULL OUTER JOIN b
ON a.Key = b.Key
WHERE a.Key IS NULL OR b.Key IS NULL
- サンプル
select a.pk as a_pk, a.value as a_value,
b.value as b_value, b.pk as b_pk
from a
full outer join b
on a.pk = b.pk
where a.pk is null
or b.pk is null;
a_pk | a_value | b_value | b_pk
------+---------+-----------+------
4 | LINCOLN | |
5 | ARIZONA | |
| | MICROSOFT | 8
| | APPLE | 9
10 | LUCENT | |
| | SCOTCH | 11
(6 rows)
JOIN ORDER
-
https://dataclass.co/sql-join-order/
- matters: LEFT JOIN, RIGHT JOIN
- doesn't matter: INNER JOIN, CROSS JOIN
感想
- 普通は INNER JOIN が一番多く利用されると想定
- 複数のテーブルの共通なところがあるため JOIN するため、ON カラムでその共通点を抽出するのがメインである。共通点が無いレコードが捨てられる。
- LEFT JOIN / RIGHT JOIN
- JOIN するテーブルの一つ(base table)は全レコードが必要で、他のテーブルはこの base table に寄せてくっつける。
- OUTER JOIN
- JOIN するテーブルはすべてのレコードが必要で、ON カラムで共通レコードを一つのレコードに統合する。共通じゃないレコードは JOIN する他のテーブルのカラムが NULL のままで新しいレコードになる
このスクラップは2023/10/08にクローズされました