言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

  1. トップページ
  2. SQL辞典
  3. UNION / UNION ALL

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』テーブルを例に説明します。椎名まゆりは掛け持ちのため両方に所属しています。

full_time_employees name 岡部倫太郎 牧瀬紅莉栖 椎名まゆり 3 rows in set

contract_employees name 椎名まゆり 橋田至 2 rows in set

正社員と契約社員の名前を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』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。