コマンド道場
FULL OUTER JOIN難易度 ★★★★

両方の表を全部残す

社員と部署を突き合わせ、どちらの表の行も 1 つも落とさずに一覧にしてください。部署に所属していない社員は部署名を NULL、社員が 1 人もいない部署は社員名を NULL にします。列は「name, busho_name」の順、部署番号(busho_id)の昇順(NULL は最後)、同じ部署なら社員番号(shain_id)の昇順(NULL は最後)に並べてください。

この書き方が使えない製品があります そのまま使える: PostgreSQL / SQLite / Oracle Database / IBM Db2

  • MySQL では使えませんFULL OUTER JOIN・ORDER BY ... NULLS LAST
  • MariaDB では使えませんFULL OUTER JOIN・ORDER BY ... NULLS LAST
  • SQL Server では使えませんORDER BY ... NULLS LAST

製品ごとの対応表(実測)を見る

  • FULL OUTER JOIN は左右どちらの行も落としません。相手がいない側は NULL で埋められます。
  • ⚠️ MySQL と MariaDB には FULL OUTER JOIN がありません。LEFT JOIN の結果と RIGHT JOIN の結果を UNION して代用します。
  • ORDER BY ... NULLS LAST も MySQL・MariaDB・SQL Server にはありません。並べ替えのキーに IS NULL を足して代用します。
● 起動中…

この問題で使えるテーブル(名前をタップすると入力できます)

7

NULL
🔑int不可
text不可
int
データを見る(先頭 5 行)
busho_idbusho_nameparent_busho_id
1経営NULL
2開発1
3営業1
4管理1
5基盤2

18

NULL
🔑int不可
text不可
int
int
numeric(10,0)不可
date不可
date
データを見る(先頭 5 行)
shain_idnamebusho_idjoushi_idsalaryhired_ontaishoku_on
1鈴木1NULL9800002014-04-01NULL
2佐藤217200002016-10-01NULL
3田中225200002019-04-01NULL
4中村225300002020-04-01NULL
5小林224450502024-04-01NULL

解説

結論

両側の行をすべて残すのが FULL OUTER JOIN です。

なぜ

内部結合は「両方にある行」だけを残し、左外部結合は「左のすべて+右の一致分」を残します。どちらの表の行も落としたくない突き合わせでは、完全外部結合が必要です。移行前後のデータ照合や、2 つの台帳の差分確認で使います。

⚠️ MySQL と MariaDB にはこの構文がありません。同じ結果は LEFT JOIN と RIGHT JOIN の UNION で作れます(次の問題で扱います)。

よくある間違い

①内部結合や片側の外部結合で済ませて行が落ちる ②NULL の並び位置を指定せず、製品によって順番が変わる。

FULL OUTER JOIN の使い方をはじめから読む

根拠(一次情報)