2 つの条件の結果を重複なくまとめる
次の 2 つの一覧を、重複する社員が 2 度出てこないようにまとめてください。①経営部または管理部に所属する在籍社員 ②給与が 650000 円以上の在籍社員。列は「名前, 給与」の順、給与の高い順に並べ、同額のときは名前の昇順にしてください。
この書き方が使えない製品があります そのまま使える: PostgreSQL / MySQL / MariaDB / SQLite / SQL Server / Oracle Database
未確認: IBM Db2
- 重複を取り除くのが UNION、そのまま連結するのが UNION ALL です。取り除く処理があるぶん UNION の方が重くなります。
- ORDER BY は連結したあと、全体に 1 回だけ書きます。これは標準 SQL の決まりです。
- つなぐ問い合わせどうしは、列の数と型の並びを揃える必要があります。
この問題で使えるテーブル(名前をタップすると入力できます)
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 |
解説
結論
2 つの結果を縦につなぐのが UNION です。重複行は 1 行にまとめられます。そのまま全部残したいときは UNION ALL を使います。
なぜ
結合(JOIN)は表を横につなぐ操作、UNION は縦につなぐ操作です。目的が違うので混同しないでください。UNION でつなぐには、2 つの SELECT の列数が同じで、対応する列の型が比較できる必要があります。列名は 1 つ目の SELECT のものが採用されます。
★UNION と UNION ALL の使い分け: 重複が起きえない(=もともと排他的な)2 つの一覧をつなぐなら UNION ALL の方が速くなります。UNION は重複を取り除くために内部で並べ替えや突き合わせを行うためです。逆に、重複がありうるのに UNION ALL を使うと、同じものが二重に数えられます。
★ORDER BY の位置: 途中の SELECT には書けません(書ける製品もありますが、意味が保証されません)。連結したあとの全体に対して、最後に 1 回だけ書きます。並べ替えのキーには 1 つ目の SELECT の列名を使います。
よくある間違い
①列の数や並びがそろっておらずエラーになる。②UNION と UNION ALL を取り違え、件数が合わなくなる。③片方の SELECT にだけ条件を書いて、もう片方に書き忘れる。
根拠(一次情報)
- PostgreSQL 18 マニュアル: 問い合わせの結合(UNION / INTERSECT / EXCEPT)一次情報・確認 2026-07-28
- PostgreSQL 18 マニュアル: SELECT(UNION 句)一次情報・確認 2026-07-28