【SQL Server】UNIONの使い方をわかりやすく解説!データを結合する基本と応用

スポンサーリンク

データベースを扱う中で、「異なるテーブルのデータを一つにまとめて一覧表示したい」と感じたことはありませんか? たとえば、国内と海外の顧客情報をまとめて表示したり、過去の売上と現在の売上を一つにして集計したり。そんな場面で活躍するのが UNION です。

UNIONは、複数のSELECT文の結果を一つにまとめるための構文です。しかし、使い方を誤るとエラーが出たり、思わぬ結果になってしまったりすることもあります。
本記事では、UNIONの基本構文から「UNION ALL」との違い、よくあるエラーの原因と対処法まで、実務に役立つ知識を丁寧に解説いたします。

UNIONの基本構文と特徴

まずは、UNIONの基本的な使い方を押さえておきましょう。

UNIONは、複数のSELECT文の結果を縦方向に結合する構文です。例えば、以下のように記述します。

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

この構文では、テーブルAテーブルBからそれぞれ同じ列を選択し、それらの結果を1つのセットにまとめて返します。ポイントは、列数とデータ型が一致している必要があるということです。列の順番や名前は異なっていても構いませんが、「列の数」と「対応する列のデータ型」が揃っていないとエラーになりますので注意が必要です。

また、UNIONにはもう一つ大きな特徴があります。
それは、重複する行は自動的に除外されるということ。つまり、同じ内容の行が複数あったとしても、結果セットには1行しか表示されません。これは内部的にDISTINCTが働いているためです。

「重複も含めてすべてのデータを取得したい」という場合には、次のセクションでご紹介する UNION ALL を使うことになります。

このように、UNIONは非常に便利な構文ですが、基本的なルールを理解したうえで使うことが肝要です。

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

理論は理解できたとしても、実際にどのように使われるのかが見えてこないと、なかなか実感が湧きませんよね。
ここからは、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をコピーしました