コマンド道場
UNION / UNION ALL難易度 ★★★☆☆

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_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

解説

結論

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 にだけ条件を書いて、もう片方に書き忘れる。

根拠(一次情報)