Closed10

SQL 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)
輝

感想

  • 普通は INNER JOIN が一番多く利用されると想定
    • 複数のテーブルの共通なところがあるため JOIN するため、ON カラムでその共通点を抽出するのがメインである。共通点が無いレコードが捨てられる。
  • LEFT JOIN / RIGHT JOIN
    • JOIN するテーブルの一つ(base table)は全レコードが必要で、他のテーブルはこの base table に寄せてくっつける。
  • OUTER JOIN
    • JOIN するテーブルはすべてのレコードが必要で、ON カラムで共通レコードを一つのレコードに統合する。共通じゃないレコードは JOIN する他のテーブルのカラムが NULL のままで新しいレコードになる
このスクラップは2023/10/08にクローズされました