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

3 つの一覧をつなぐ

次の 3 つの一覧を、区分の名前を付けて 1 つにまとめてください。①給与が 50 万円以上の社員は「給与上位」②退職した社員は「退職」③部署に所属していない社員は「部署なし」。同じ社員が複数の区分に当てはまる場合は、区分ごとに別の行として残します。列名は区分が kubun で、列は「name, kubun」の順、区分の昇順、同じならば氏名の昇順に並べてください。

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

未確認: IBM Db2

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

  • つなぐ問い合わせは 3 つ以上でも構いません。列の数と型の並びが揃っていれば続けて書けます。
  • 定数を列として並べられます。どの一覧から来た行かを示すのに使えます。
  • ここでは UNION ALL を使いますが、区分の値が違うため UNION でも同じ結果になります。それでも UNION ALL を選ぶのは、重複を取り除く処理が要らないぶん速いからです。
● 起動中…

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

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

解説

結論

つなぐ問い合わせは 3 つ以上でも構いません。定数を列として添えられます。

なぜ

UNION / UNION ALL は 2 項演算子ですが、続けて書けば何段でもつなげます。列の数と型の並びが揃っていることだけが条件です。列名は最初の問い合わせのものが使われるので、AS は 1 つ目に書きます。

定数を列として並べると、「どの一覧から来たか」を結果に残せます。区分ごとに集計したいときや、複数の条件に当てはまる行を数えたいときに効きます。このデータでは、退職した社員の 1 人が給与上位にも当てはまるため、その人は区分違いで 2 行に出ます。

⚠️ ここで UNION にしても結果は同じです。区分の値が違えば「同じ行」ではないので、重複として取り除かれないからです。UNION が消すのは行全体が一致するものだけ、という点を押さえてください。それでも UNION ALL を選ぶのは、取り除く処理が要らないぶん速いためです。

よくある間違い

①列の数や型の並びがずれてエラーになる ②UNION は「似た行」をまとめてくれると思い込む。

根拠(一次情報)