inner join と outer join の違いと覚え方の自分用まとめ(外部表、駆動表もメモ)

テーブルの結合は、技術者であれば様々な局面で使用することが多いですが、少し間が空いてしまうと、忘れることが多い自分のために、まとめておこうかと。。

まず、例として以下のようなテーブルを用意。

CREATE TABLE 売上
(	"売上ROW_ID" NUMBER,
	"売上日" DATE,
	"顧客CD" VARCHAR2(4)
);


CREATE TABLE 顧客
(	"顧客CD" VARCHAR2(4),
	"顧客名" VARCHAR2(255)
);

 

各々のテーブルには以下のようにデータが入っていることにします。

【売上テーブル】

売上ROW_ID 売上日 顧客CD
1 13-01-01 C001
2 13-02-01 C002
3 13-03-01 C003
4 13-04-01
5 13-05-01 TMP
6 13-06-01 C001

 

【顧客テーブル】

顧客CD 顧客名
C001 田中さん
C002 鈴木さん

 

①INNER JOIN

select * from 売上 inner join 顧客 on (売上.顧客CD = 顧客.顧客CD)

 

INNER JOINは、結合する両方のテーブルに存在するレコードを取得します。

売上ROW_ID 売上日 顧客CD 顧客CD 顧客名
1 13-01-01 C001 C001 田中さん
2 13-02-01 C002 C002 鈴木さん
6 13-06-01 C001 C001 田中さん

 

 

②LEFT OUTER JOIN

select * from 売上 left outer join 顧客 on (売上.顧客CD = 顧客.顧客CD)

 

LEFT OUTER JOINは、左のテーブルのレコードを全て抽出したうえで、結合条件にしたがって、右の表のレコードを結合していきます。このとき、結合できない場合は、NULLとなります。

売上ROW_ID 売上日 顧客CD 顧客CD 顧客名
1 13-01-01 C001 C001 田中さん
2 13-02-01 C002 C002 鈴木さん
3 13-03-01 C003 NULL NULL
4 13-04-01 NULL NULL NULL
5 13-05-01 TMP NULL NULL
6 13-06-01 C001 C001 田中さん

 

③RIGHT OUTER JOIN

select * from 売上 right outer join 顧客 on (売上.顧客CD = 顧客.顧客CD)

 

RIGHT OUTER JOINは、右のテーブルのレコードを全て抽出したうえで、結合条件にしたがって、左の表のレコードを結合していきます。このとき、結合できない場合は、NULLとなります。

下の結果で少し注意したいのは、売上テーブルには、「C001」という顧客CDをもつレコードが2件あるため、結果の行数も全3件になっていることです。

売上ROW_ID 売上日 顧客CD 顧客CD 顧客名
1 13-01-01 C001 C001 田中さん
2 13-02-01 C002 C002 鈴木さん
6 13-06-01 C001 C001 田中さん

 

 

自分の覚え方

上記を見ても分かるように、OUTER JOINのLEFT、RIGHTは、どちらのテーブルを基準にするかを指定しています。

①「select * from 基準のテーブル」 で基準テーブルのレコードを全件抽出する。
⇒外部表(OUTER)、駆動表
{
       LOOP
{
②上記で抽出したレコードに対して、結合条件に合致するレコードを
もう1つのテーブルから取得していく
}
END LOOP
}

 

のようになっているとイメージすると良いです。

つまり、①で、LOOPの外側(OUTER)となっているテーブルが基準となり、それを指定しているのがLEFTの方なのか、RIGHTの方なのかというわけです。

そのため、①の方のテーブルを「外部表」と言ったり、「駆動表」と呼んだりします。

 



こんな記事も関係あるかも。読んでみてね。

コメントを残す

サブコンテンツ

このページの先頭へ