今日2回目の記事だメラメラ


仕事をしているとよく「INNER JOINって何だっけ?」とか
「FULL JOINってやるとどうなんだっけ?」ってよく聞かれる目
たぶんデータベーススペシャリストを持ってるからだと思う。

でも、恥ずかしながら、俺もたまに混乱して分からなくなってしまう叫び目
(まぐれで取ったようなもんだから...目)

で、データ/SQL/結果という観点でまとめてみることにしたにひひ

なお、スクロールせずに比較できるように、情報をなるべく一画面に収めるように心掛けた。
このため、説明等はあまりしていない。説明を見たい方は別サイトを参照くださいm(_ _)m

また、下の方にSQL Server 2005での実データでの実験もしているので、参考にどうぞ。

<データ>
■テーブル左 (テーブル右と番号が共通している行は、100と300)
  番号 名前
  100  A
  102  B
  300  C
■テーブル右(テーブル右と番号が共通している行は、100と300)
  番号 値段
  100  100円
  200  200円
  300  300円

■INNER JOIN
 <SQL>
 SELECT 左.番号, 名前, 右.番号, 値段 FROM テーブル左 左 INNER JOIN テーブル右 右 ON 左.番号 = 右.番号
 <結果>
  左番号 名前 右番号 値段
  100   A  100   100円
  300   C  300   300円

■LEFT (OUTER) JOIN
 <SQL>
 SELECT 左.番号, 名前, 右.番号, 値段 FROM テーブル左 左 LEFT (OUTER) JOIN テーブル右 右 ON 左.番号 = 右.番号
 <結果>
  左番号 名前 右番号 値段
  100   A   100   100円
  102   B   NULL  NULL
  300   C   300   300円

■RIGHT (OUTER) JOIN
 <SQL>
 SELECT 左.番号, 名前, 右.番号, 値段 FROM テーブル左 左 RIGHT (OUTER) JOIN テーブル右 右 ON 左.番号 = 右.番号
 <結果>
  左番号 名前 右番号 値段
  100   A   100   100円
  NULL NULL 200   200円
  300   C   300   300円

■FULL (OUTER) JOIN
 <SQL>
 SELECT 左.番号, 名前, 右.番号, 値段 FROM テーブル左 左 FULL (OUTER) JOIN テーブル右 右 ON 左.番号 = 右.番号
 <結果>
  左番号 名前 右番号 値段
  100  A    100   100円
  102  B    NULL  NULL
  NULL NULL  200   200円
  300  C    300   300円

■CROSS JOIN
 <SQL>
 SELECT 左.番号, 名前, 右.番号, 値段 FROM テーブル左 左 LEFT OUTER JOIN テーブル右 右 ON 左.番号 = 右.番号
 <結果>
  左番号 名前 右番号 値段
  100   A   100   100円
  102   B   100   100円
  300   C   100   100円
  100   A   200   200円
  102   B   200   200円
  300   C   200   200円
  100   A   300   300円
  102   B   300   300円
  300   C   300   300円


---------------------------------------
ここから↓はSQL Server 2005での実行例
---------------------------------------
■テーブルの作成とデータのインサート
 1> create table LeftTbl(No char(3), name varchar(10));
 2> go
 1> create table RightTbl(No char(3), price decimal(4));
 2> go
 1> insert into LeftTbl values ('102', 'B')
 2> insert into LeftTbl values ('100', 'A')
 3> insert into LeftTbl values ('300', 'C')
 4> go
 (1 行処理されました)
 1> insert into RightTbl values ('100', 100)
 2> insert into RightTbl values ('200', 200)
 3> insert into RightTbl values ('300', 300)
 4> go
 (1 行処理されました)


■左テーブルの表示
 1> select * from LeftTbl order by No
 2> go
 No name
 --- ----------
 100 A
 102 B
 300 C

 (3 行処理されました)

■右テーブルの表示
 1> select * from RightTbl order by No
 2> go
 No price
 --- ------
 100  100
 200  200
 300  300

 (3 行処理されました)

 ⇒ priceに「円」が付いてないのは、愛嬌ってことで(> <)

■INNER JOINの実行
 1> SELECT L.No 左番号, name 名前, R.No 右番号, price 値段 FROM LeftTbl L INNER JOIN RightTbl R ON L.No = R.No;
 2> go
 左番号 名前 右番号 値段
 ---  ---- ---  ------
 100  A   100  100
 300  C   300  300

 (2 行処理されました)

■LEFT (OUTER) JOINの実行
1> SELECT L.No 左番号, name 名前, R.No 右番号, price 値段 FROM LeftTbl L LEFT OUTER JOIN RightTbl R ON L.No = R.No;
2>
3> go
 左番号 名前 右番号 値段
 ---  ---- ---  ------
 100  A   100  100
 102  B   NUL  NULL
 300  C   300  300

 (3 行処理されました)

■RIGHT (OUTTER) JOINの実行
1> SELECT L.No 左番号, name 名前, R.No 右番号, price 値段 FROM LeftTbl L RIGHT OUTER JOIN RightTbl R ON L.No = R.No;
2>
3> go
 左番号 名前 右番号 値段
 ---  ---- ---  ------
 100  A   100  100
 NUL  NULL 200  200
 300  C   300  300

 (3 行処理されました)

■FULL (OUTTER) JOINの実行
 1> SELECT L.No 左番号, name 名前, R.No 右番号, price 値段 FROM LeftTbl L FULL OUTER JOIN RightTbl R ON L.No = R.No;
 2>
 3> go
 左番号 名前 右番号 値段
 ---  ---- ---  ------
 100  A   100  100
 102  B   NUL  NULL
 300  C   300  300
 NUL  NULL 200  200

 (4 行処理されました)

■CROSS JOINの実行
 1> SELECT L.No 左番号, name 名前, R.No 右番号, price 値段 FROM LeftTbl L CROSS JOIN RightTbl R;
 2> go
 左番号 名前 右番号 値段
 ---  ---- ---  ------
 100  A   100  100
 102  B   100  100
 300  C   100  100
 100  A   200  200
 102  B   200  200
 300  C   200  200
 100  A   300  300
 102  B   300  300
 300  C   300  300

 (9 行処理されました)