SQL FROM句:外部結合(LEFT OUTER JOIN)の考え方
「社員マスタ」と「部署マスタ」というテーブルがあります。
今回は、社員は必ず部署に属しているというわけではなく、まだ所属部署が決まっていない状態の社員もいます。
社員コード | 社員名 | 部署コード |
---|---|---|
1 | テスト社員1 | 1 |
2 | テスト社員2 | 2 |
3 | テスト社員3 | null |
部署コード | 部署名 |
---|---|
1 | 開発部 |
2 | 営業部 |
社員と所属部署の一覧を表示したい。また、所属部署が部署マスタに存在しない場合も表示したい。
SQL
は下記のようになります。
SELECT T1.社員名
,T2.部署名
FROM 社員マスタ AS T1
LEFT JOIN 部署マスタ AS T2
ON T1.部署コード = T2.部署コード
今回はFROM
句でJOIN
ではなくLEFT JOIN
を使用します。
JOIN
でテーブル同士を結合することを「内部結合」、LEFT JOIN
でテーブル同士を結合することを「外部結合」と呼びます。
また、JOIN
はINNER JOIN
の省略形で、LEFT JOIN
はLEFT OUTER JOIN
の省略形で、それぞれ意味は同じです。
内部結合と外部結合の違い
上記SQLのLEFT JOIN
の部分をJOIN
にして実行した場合、結果は下記になります。
社員名 | 部署名 |
---|---|
テスト社員1 | 開発部 |
テスト社員2 | 営業部 |
「テスト社員3」のデータが表示されません。
JOIN
では結合条件ON T1.部署コード = T2.部署コード
に該当しない場合は、データを取得しないからです。
LEFT JOIN
では、テーブルをメインのテーブル(社員マスタ)とJOIN
する結合テーブル(部署マスタ)という考え方をします。
結合条件に関わらず、メインのテーブルは必ず出力します。
わかりやすくするために、結合条件を除いたSQL
を実行してみます。
SELECT T1.社員名
,T2.部署名
,T1.部署コード AS 社員_部署コード
,T2.部署コード AS 部署_部署コード
FROM 社員マスタ AS T1
LEFT JOIN 部署マスタ AS T2
ON 1=1
社員名 | 部署名 | 社員_部署コード | 部署_部署コード |
---|---|---|---|
テスト社員1 | 開発部 | 1 | 1 |
テスト社員1 | 営業部 | 1 | 2 |
テスト社員2 | 開発部 | 2 | 1 |
テスト社員2 | 営業部 | 2 | 2 |
テスト社員3 | 開発部 | null | 1 |
テスト社員3 | 営業部 | null | 2 |
赤背景の行は、結合条件ON T1.部署コード = T2.部署コード
を追加した場合は、条件にマッチしないため、出力されないデータです。
LEFT JOIN
はメインとなるテーブル(社員マスタ)のデータは結合条件に関わらず出力されるため、JOIN
の場合は出力されなくなってしまうテスト社員3のデータは、結合するテーブル(部署マスタ)と紐付かない状態で出力されます。
テスト社員3は部署マスタとは紐付いていないため、部署_部署コードや部署名にはnull
が入っています。
社員名 | 部署名 |
---|---|
テスト社員1 | 開発部 |
テスト社員2 | 営業部 |
テスト社員3 | null |