UNION / UNION ALL
| 対応: | SQL-92(1992) |
|---|
複数のSELECT文の結果を縦方向に結合する演算子です。『UNION』は重複行を除去し、『UNION ALL』は重複を保持したまますべての行を返します。
構文
UNION: 重複を除去して結合します。
SELECT col1, col2 FROM table_a UNION SELECT col1, col2 FROM table_b;
UNION ALL: 重複を保持してすべての行を結合します。
SELECT col1, col2 FROM table_a UNION ALL SELECT col1, col2 FROM table_b;
3つ以上のSELECTも連結できます。
SELECT col1, col2 FROM table_a UNION ALL SELECT col1, col2 FROM table_b UNION ALL SELECT col1, col2 FROM table_c ORDER BY col1;
構文一覧
| 構文 | 概要 |
|---|---|
| UNION | 複数のSELECT結果を縦に結合し、重複行を除去します。 |
| UNION ALL | 複数のSELECT結果を縦に結合し、重複行もすべて保持します。UNIONより高速です。 |
サンプルコード
以下の『full_time_employees』テーブルと『contract_employees』テーブルを例に説明します。椎名まゆりは掛け持ちのため両方に所属しています。
正社員と契約社員の名前を1つのリストにまとめます。『UNION』は重複を除去するため、椎名まゆりは1回だけ表示されます。
sample_union.sql
SELECT name FROM full_time_employees UNION SELECT name FROM contract_employees ORDER BY name;
+------------+ | name | +------------+ | 岡部倫太郎 | | 橋田至 | | 椎名まゆり | | 牧瀬紅莉栖 | +------------+ 4 rows in set
『UNION ALL』は重複を保持します。椎名まゆりが両方のテーブルに存在するため、2回表示されます。
sample_union.sql
SELECT name FROM full_time_employees UNION ALL SELECT name FROM contract_employees ORDER BY name;
+------------+ | name | +------------+ | 岡部倫太郎 | | 橋田至 | | 椎名まゆり | | 椎名まゆり | | 牧瀬紅莉栖 | +------------+ 5 rows in set
SELECT文に定数値を追加すると、どのテーブルから取得したかをラベル付きで表示できます。
sample_union.sql
SELECT name, 'フルタイム' AS employment_type FROM full_time_employees UNION ALL SELECT name, '契約' FROM contract_employees ORDER BY name;
+------------+-----------------+ | name | employment_type | +------------+-----------------+ | 岡部倫太郎 | フルタイム | | 橋田至 | 契約 | | 椎名まゆり | フルタイム | | 椎名まゆり | 契約 | | 牧瀬紅莉栖 | フルタイム | +------------+-----------------+ 5 rows in set
データベース別の書き方
『UNION』・『UNION ALL』の構文は主要なデータベースで共通して使用できます。
SELECT name, 'フルタイム' AS employment_type FROM full_time_employees UNION ALL SELECT name, '契約' FROM contract_employees ORDER BY name;
Oracle では文字列リテラルの型変換に注意が必要です。列のデータ型に厳密な互換性が求められるため、必要に応じて『CAST』で型を合わせてください。
概要
『UNION』を使うには、すべてのSELECT文の列数が同じで、対応する列のデータ型が互換性を持っている必要があります。列名は最初のSELECT文の列名が採用されます。
重複行がないことが確実な場合や、重複を保持したい場合は『UNION ALL』を使ってください。『UNION』は重複除去のためにソート処理が走り、『UNION ALL』より遅くなります。行数が多い場合は特に差が出ます。
ORDER BY は全体の末尾に1つだけ書きます。各SELECT文にはORDER BYを付けられません。共通行・差分行を取り出す演算子は『INTERSECT / EXCEPT』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。