【SQL Server】UNIONとは?複数のSELECT結果を統合する方法

スポンサーリンク

SQL Serverで複数のSELECT文の結果をまとめて扱いたいときに活用されるのが「UNION」句です。この記事では、UNIONの基本的な使い方から、UNION ALLとの違い、活用時の注意点まで詳しく解説します。

UNIONとは?

UNIONは、複数のSELECT文の結果セットを結合し、重複行を排除した上で1つの結果セットとして返すSQLの集合演算子です。

用途の例

  • 異なるテーブルから同様の形式でデータを取得し、一覧表示したいとき
  • 同じテーブルの異なる条件によるデータを1つにまとめたいとき
SELECT 列1, 列2 FROM テーブルA
UNION
SELECT 列1, 列2 FROM テーブルB;

この例では、テーブルAとテーブルBから同じ構造のデータを取得し、重複行を除外した形で統合しています。

UNION ALLとの違い

さて、前章でご紹介したUNIONには「重複行を自動的に除外する」という特徴がありましたね。
では、重複をそのまま表示したい場合はどうすればよいのでしょうか?

そのときに登場するのが、UNION ALL です。

SELECT 列1 FROM テーブルA  
UNION ALL  
SELECT 列1 FROM テーブルB;

このように書くと、両方のSELECT文から得られたすべての行が、重複を取り除かずに結合されます
つまり、UNIONとは異なり、全件をそのまま出力するのがUNION ALLの動きです。

ここで一つ、実務的な観点から大切なお話をしましょう。
UNIONは重複排除のために内部的にソート処理が行われるため、データ量が多い場合にはパフォーマンスに影響が出ることがあります
一方で、UNION ALLは重複チェックを行わないため、より高速に処理される傾向があります。

ですから、重複があっても構わない場面や、データ量が多く速度が求められる場面では、UNION ALLのほうが適していると言えるでしょう。

UNION使用時の注意点

列数とデータ型の一致

各SELECT文の列数および、それぞれの列のデータ型が一致している必要があります。これが異なると、エラーになります。

-- 列数が異なる例(エラーになる)
SELECT id, name FROM employee
UNION
SELECT id FROM manager;

ORDER BY句の使用位置

ORDER BY句は、全体のUNION結果に対して適用します。個別のSELECT文内には書けません。

SELECT name FROM employee
UNION
SELECT name FROM manager
ORDER BY name;

GROUP BYや集計関数との併用

UNIONの結果に対してGROUP BYや集計関数を使いたい場合は、UNIONをサブクエリとしてまとめるのが一般的です。

SELECT name, COUNT(*)
FROM (
  SELECT name FROM employee
  UNION ALL
  SELECT name FROM manager
) AS combined
GROUP BY name;

使用例で理解するUNION

理論は理解できたとしても、実際にどのように使われるのかが見えてこないと、なかなか実感が湧きませんよね。
ここからは、UNIONおよびUNION ALLを使った具体的な使用例をご紹介いたします。実務でも役立つケースを想定しておりますので、ぜひ参考にしてください。

例1:国内と海外の顧客をまとめて表示する

たとえば、customers_domestic(国内顧客)とcustomers_foreign(海外顧客)という2つのテーブルがあるとしましょう。
両方の顧客の名前とメールアドレスを、ひとつにまとめて一覧表示したい場合は、以下のように記述します。

SELECT name, email FROM customers_domestic  
UNION  
SELECT name, email FROM customers_foreign;

このクエリでは、両テーブルの顧客情報がまとめて表示されますが、同じ名前・メールアドレスのデータが重複している場合は1件のみになります。
つまり、「重複のないユニークな顧客一覧」が得られるのです。

例2:過去と現在の売上データを全件表示

次に、sales_2023sales_2024という売上データがあり、それらを重複を含めてすべて表示したい場合を考えてみましょう。
この場合は、UNIONではなくUNION ALLを使用します。

SELECT product_name FROM sales_2024  
UNION ALL  
SELECT product_name FROM sales_2023;

このように書くと、同じ商品名が複数回登場していてもすべての行が出力されます
データの集計や件数の確認をしたい場合など、重複を含めた正確なデータ量が重要な場面で効果を発揮します。

このように、UNIONとUNION ALLは使い分けによって大きく結果が変わります。
「何を目的にデータを結合するのか」を明確にして、適切な構文を選びましょう。

まとめ

今回は、SQL ServerにおけるUNIONの基本とその活用法について、一通りご紹介いたしました。

UNIONは、複数のSELECT文の結果をひとつにまとめるための非常に有用な構文です。ただし、列数やデータ型の一致ORDER BYの記述位置など、いくつかのルールを守らなければ思わぬエラーにつながることもあります。

また、UNIONとUNION ALLの違いを正しく理解し、状況に応じて使い分けることも重要でしたね。
重複を取り除いてスッキリした一覧を出したいのか、それとも正確な件数や重複を含めたデータを扱いたいのか。目的に応じて最適な選択をすることが、実務では何より大切です。

SQLの構文は、一見シンプルに見えても、深く知るほどその力を実感できるものです。
今回の内容が、皆さんの理解を少しでも深めるきっかけとなれば幸いです。

SQL Server
スポンサーリンク
なんくるをフォローする

コメント

タイトルとURLをコピーしました