UNION と UNION ALL の違い : 重複・処理速度・使い分け

に投稿

UNION と UNION ALL の違い : 重複・処理速度・使い分けを理解することは、SQLで複数の検索結果を一つにまとめるときに重要です。どちらも複数のSELECT文の結果を結合するために使用されますが、大きな違いは「重複した行を残すかどうか」です。SQLでは、この違いを理解しておくことで、目的に合ったクエリを作成できます。

特に、UNIONとUNION ALLは見た目がよく似ているため、初心者は混同しやすい表現です。しかし、UNIONは重複する行を削除するのに対し、UNION ALLは重複をそのまま残します。そのため、データの内容だけでなく、処理速度にも違いが生じる場合があります。

1. UNIONとは?

UNIONは、2つ以上のSELECT文から取得した結果を一つの結果セットにまとめるSQLの集合演算子です。

例えば、次のようなSQLがあります。

SELECT name
FROM customers_2025

UNION

SELECT name
FROM customers_2026;

この場合、customers_2025とcustomers_2026の両方から取得したnameが一つの結果として表示されます。

重要なのは、同じ行が複数存在する場合、重複が削除されることです。つまり、同じデータが2回、3回存在していても、UNIONでは基本的に1行として扱われます。

2. UNION ALLとは?

UNION ALLも複数のSELECT文の結果を一つにまとめます。しかし、UNIONとは違い、重複した行を削除しません。

例えば、

SELECT name
FROM customers_2025

UNION ALL

SELECT name
FROM customers_2026;

とすると、両方のテーブルに同じnameが存在している場合、そのデータもそのまま結果に表示されます。

例えば、次のデータがあるとします。

  • customers_2025:田中、佐藤、鈴木
  • customers_2026:田中、山田、佐藤

UNIONを使用すると、

田中
佐藤
鈴木
山田

となります。

一方、UNION ALLでは、

田中
佐藤
鈴木
田中
山田
佐藤

のように、重複したデータも残ります。

3. UNIONとUNION ALLの主な違い

両者の違いを簡単に整理すると、次のようになります。

  1. UNION
    • 複数のSELECT結果を結合する
    • 重複する行を削除する
    • 結果を一意のデータにしたい場合に適している
  2. UNION ALL
    • 複数のSELECT結果を結合する
    • 重複する行も残す
    • 元のデータをすべて保持したい場合に適している

つまり、最も重要なポイントは、

UNION = 重複を削除する

UNION ALL = 重複を残す

という違いです。

4. 処理速度にも違いがある

UNIONとUNION ALLでは、処理方法にも違いがあります。

UNIONでは、結果を結合した後に重複する行を確認して削除する必要があります。そのため、データ量が多い場合には、重複を確認するための追加処理が発生します。

一方、UNION ALLでは重複を削除する必要がないため、基本的には各SELECTの結果をそのまま結合します。そのため、重複を削除する必要がない場合は、UNION ALLのほうが効率的になりやすいとされています。

例えば、2つのテーブルが完全に異なるデータを持っていて、重複する可能性がない場合は、UNIONを使用する必要性は低くなります。

5. UNIONとUNION ALLの基本的な構文

基本的な構文は次のとおりです。

UNIONの場合

SELECT column1, column2
FROM table1

UNION

SELECT column1, column2
FROM table2;

UNION ALLの場合

SELECT column1, column2
FROM table1

UNION ALL

SELECT column1, column2
FROM table2;

どちらの場合も、結合するSELECT文には基本的な条件があります。

  • SELECTする列の数が同じである
  • 列の順番が対応している
  • 対応する列のデータ型が互換性を持っている

例えば、1つ目のSELECTで3列を取得しているなら、2つ目のSELECTでも3列を取得する必要があります。

6. UNIONとUNION ALLはどちらを使う?

実際の開発では、目的によって使い分けることが重要です。

  1. 重複を削除したい場合→ UNIONを使用します。SELECT product_id FROM products_a UNION SELECT product_id FROM products_b; 商品IDを一意にまとめたい場合などに適しています。
  2. すべてのデータを残したい場合→ UNION ALLを使用します。SELECT product_id FROM sales_a UNION ALL SELECT product_id FROM sales_b; 売上データなど、同じIDが複数回登場すること自体に意味がある場合は、重複を削除してはいけません。
  3. 重複がないことが分かっている場合→ UNION ALLが適している場合があります。不要な重複チェックを避けられるため、処理効率の面でもメリットがあります。

まとめ

UNION と UNION ALL の違い : 重複・処理速度・使い分けを理解するポイントは、「重複データをどう扱うか」です。UNIONは複数のSELECT結果を結合したうえで重複する行を削除します。一方、UNION ALLは重複を削除せず、すべての行をそのまま結合します。そのため、重複をなくしたい場合はUNION、元のデータをすべて保持したい場合はUNION ALLを使用するのが基本です。また、重複削除が不要な場合には、UNION ALLのほうが効率的になりやすいため、目的に応じて適切に使い分けることが重要です。