Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

UNION / UNION ALL

複数のSELECT文の結果を縦方向に結合する演算子です。『UNION』は重複行を除去し、『UNION ALL』は重複を保持したまますべての行を返します。

構文
-- UNION: 重複を除去して結合します。
SELECT 列1, 列2 FROM テーブルA
UNION
SELECT 列1, 列2 FROM テーブルB;

-- UNION ALL: 重複を保持してすべての行を結合します。
SELECT 列1, 列2 FROM テーブルA
UNION ALL
SELECT 列1, 列2 FROM テーブルB;

-- 3つ以上のSELECTも連結できます。
SELECT 列1, 列2 FROM テーブルA
UNION ALL
SELECT 列1, 列2 FROM テーブルB
UNION ALL
SELECT 列1, 列2 FROM テーブルC
ORDER BY 列1;
構文一覧
構文概要
UNION複数のSELECT結果を縦に結合し、重複行を除去します。
UNION ALL複数のSELECT結果を縦に結合し、重複行もすべて保持します。UNIONより高速です。
サンプルコード
-- 正社員と契約社員を1つのリストにまとめます(重複除去)。
SELECT 社員名, 'フルタイム' AS 雇用形態
FROM 正社員
UNION
SELECT 社員名, '契約'
FROM 契約社員
ORDER BY 社員名;

-- 今月と先月の注文を重複保持で結合して全件集計します。
SELECT 顧客ID, 注文日, 合計金額
FROM 注文_今月
UNION ALL
SELECT 顧客ID, 注文日, 合計金額
FROM 注文_先月
ORDER BY 注文日 DESC;

-- 定数値を追加して分類ラベル付きで出力します。
SELECT '東京' AS 地区, 店舗名, 売上
FROM 店舗
WHERE 都道府県 = '東京都'
UNION ALL
SELECT '大阪', 店舗名, 売上
FROM 店舗
WHERE 都道府県 = '大阪府'
ORDER BY 売上 DESC;
実行結果
-- 正社員と契約社員のリスト(UNION で重複除去)。
社員名     | 雇用形態
-----------+------------
鈴木 花子  | フルタイム
佐藤 次郎  | 契約
田中 恵    | フルタイム
山田 太郎  | 契約

-- 地区別店舗リスト。
地区  | 店舗名       | 売上
------+--------------+---------
東京  | 秋葉原店     | 3200000
大阪  | なんば店     | 2850000
東京  | 新宿店       | 2600000
データベース別の書き方

『UNION』・『UNION ALL』の構文は主要なデータベースで共通して使用できます。

-- MySQL・PostgreSQL・SQL Server・Oracle・SQLite 共通
SELECT 社員名, 'フルタイム' AS 雇用形態
FROM 正社員
UNION ALL
SELECT 社員名, '契約'
FROM 契約社員
ORDER BY 社員名;

Oracle では文字列リテラルの型変換に注意が必要です。列のデータ型に厳密な互換性が求められるため、必要に応じて『CAST』で型を合わせてください。

概要

『UNION』を使うには、すべてのSELECT文の列数が同じで、対応する列のデータ型が互換性を持っている必要があります。列名は最初のSELECT文の列名が採用されます。

重複行がないことが確実な場合や、重複を保持したい場合は『UNION ALL』を使ってください。『UNION』は重複除去のためにソート処理が走り、『UNION ALL』より遅くなります。行数が多い場合は特に差が出ます。

ORDER BY は全体の末尾に1つだけ書きます。各SELECT文にはORDER BYを付けられません。共通行・差分行を取り出す演算子は『INTERSECT / EXCEPT』を参照してください。

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