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 |