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

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

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

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

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

①INNER JOIN

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

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

②LEFT OUTER JOIN

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

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

③RIGHT OUTER JOIN

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

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

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

自分の覚え方

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

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

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

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

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