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_id | busho_name | parent_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_id | name | busho_id | joushi_id | salary | hired_on | taishoku_on |
|---|---|---|---|---|---|---|
| 1 | 鈴木 | 1 | NULL | 980000 | 2014-04-01 | NULL |
| 2 | 佐藤 | 2 | 1 | 720000 | 2016-10-01 | NULL |
| 3 | 田中 | 2 | 2 | 520000 | 2019-04-01 | NULL |
| 4 | 中村 | 2 | 2 | 530000 | 2020-04-01 | NULL |
| 5 | 小林 | 2 | 2 | 445050 | 2024-04-01 | NULL |
解説
結論
両側の行をすべて残すのが FULL OUTER JOIN です。
なぜ
内部結合は「両方にある行」だけを残し、左外部結合は「左のすべて+右の一致分」を残します。どちらの表の行も落としたくない突き合わせでは、完全外部結合が必要です。移行前後のデータ照合や、2 つの台帳の差分確認で使います。
⚠️ MySQL と MariaDB にはこの構文がありません。同じ結果は LEFT JOIN と RIGHT JOIN の UNION で作れます(次の問題で扱います)。
よくある間違い
①内部結合や片側の外部結合で済ませて行が落ちる ②NULL の並び位置を指定せず、製品によって順番が変わる。
根拠(一次情報)
- PostgreSQL 18 マニュアル: 結合テーブル一次情報・確認 2026-08-01