2025年12月9日火曜日

SQL Server 集合演算子(UNION・INTERSECT・EXCEPT)の使い方と違いを理解する

複数のSELECT結果を組み合わせるには?SQL ServerのUNION・INTERSECT・EXCEPTの違いをわかりやすく解説

SQL Serverでは、複数のSELECT文の結果をまとめたり、共通部分・差分を取得したりする場合に集合演算子(Set Operators)を使用します。
代表的な演算子は UNIONINTERSECTEXCEPT の3種類です。
この記事では、それぞれの構文と動作の違い、実務での使い分け方をわかりやすく解説します。

目次

集合演算子とは?SQLの集合処理の基本

複数のSELECT結果を「集合」として扱う

集合演算子は、複数のSELECT文で取得した結果セット(行の集合)を1つにまとめて処理するための構文です。
SQL Serverでは以下の3種類が用意されています。

演算子 意味
UNION / UNION ALL 2つの結果を結合(和集合)
INTERSECT 共通部分(交差)を抽出
EXCEPT 一方にだけ存在する行を抽出(差集合)

全ての演算子で、結合するSELECT文は同じ列数・列順・データ型である必要があります。

UNIONとUNION ALLの違い

UNIONの基本構文

UNIONは、複数のSELECT結果をまとめて1つの集合にします。重複行は自動的に除外されます。


SELECT City FROM Customers
UNION
SELECT City FROM Suppliers;

両方のテーブルに存在する都市名があっても、結果には1回だけ表示されます。

UNION ALLとの違い

UNION ALLは、重複を除外せず全ての行を結合します。


SELECT City FROM Customers
UNION ALL
SELECT City FROM Suppliers;

重複チェックが不要な分、UNION ALLの方が高速です。 性能を重視する場合は UNION ALL の使用を検討しましょう。

INTERSECTの使い方(共通部分の抽出)

INTERSECTの基本構文

INTERSECTは、両方のSELECT結果に共通する行だけを抽出します。


SELECT City FROM Customers
INTERSECT
SELECT City FROM Suppliers;

この例では、顧客と仕入先の両方に存在する都市名のみが返されます。

ポイント

  • 重複は自動的に除外される(DISTINCT扱い)
  • データ型と列順が一致していないとエラーになる
  • JOINを使うより短く書けるが、内部的にはソートやハッシュ比較を行う

EXCEPTの使い方(差集合の抽出)

EXCEPTの基本構文

EXCEPTは、左側のSELECT結果にあって右側にない行を返します。


SELECT City FROM Customers
EXCEPT
SELECT City FROM Suppliers;

この例では、「顧客には存在するが仕入先には存在しない都市」が取得されます。

EXCEPT ALL は使える?

SQL Serverでは EXCEPT ALL はサポートされていません(PostgreSQLなど一部でのみ対応)。
必要な場合はGROUP BYやJOINを組み合わせて再現します。

各演算子の違いと実行順序の注意点

処理の流れ

集合演算子は基本的に上から順に処理され、最後にORDER BYを1回だけ指定できます。


SELECT City FROM Customers
UNION
SELECT City FROM Suppliers
ORDER BY City;

ORDER BYは最終SELECTの外側にのみ書くことができます。
中間のSELECTにはORDER BYを記述できません。

比較表

演算子 動作 重複処理 特徴
UNION 両方の結果を結合 重複削除 標準的な結合処理
UNION ALL 両方の結果を結合 重複保持 高速・ログ分析などに最適
INTERSECT 共通部分のみ取得 重複削除 シンプルな重複抽出に便利
EXCEPT 左側−右側の差集合 重複削除 不一致データの検出に最適

実務での活用例とベストプラクティス

① データ差分の検出(EXCEPT)


SELECT EmployeeID FROM HRDB.dbo.Employees
EXCEPT
SELECT EmployeeID FROM PayrollDB.dbo.Employees;

人事DBには登録されているが、給与DBには存在しない従業員を検出できます。

② 異なるテーブルのマージ(UNION ALL)


SELECT '顧客' AS Type, CustomerName AS Name FROM Customers
UNION ALL
SELECT '仕入先' AS Type, SupplierName FROM Suppliers;

同一形式のデータをまとめてレポート出力したいときに便利です。

③ 双方に存在するデータ確認(INTERSECT)


SELECT ProductID FROM Warehouse
INTERSECT
SELECT ProductID FROM OnlineStore;

在庫DBとオンラインストアDBの両方に登録されている商品を抽出できます。

ベストプラクティス

  • 結合列のデータ型・順序を常に一致させる
  • 重複削除が不要ならUNION ALLを使う
  • 差分チェックにはEXCEPT、共通データにはINTERSECTを活用
  • ORDER BYはクエリ全体の最後にのみ記述

まとめと次のステップ

学んだ内容の整理

  • 集合演算子は複数SELECTの結果を結合・比較・除外する構文。
  • UNION/UNION ALL/INTERSECT/EXCEPTを用途別に使い分ける。
  • UNION ALLは高速、INTERSECTとEXCEPTは重複削除を自動処理。
  • ORDER BYは最終SELECTにのみ記述できる。
SQL Server学習シリーズ
◀ 【第1章】【第15回】CTE(再帰)の活用
【第2章】【第1回】文字列関数まとめ ▶
目次へ

🔸次回から 第2章:関数と式(仕事で使う標準テク) に進みます。
文字列・数値・日付などの関数をまとめて理解し、SQLをより柔軟に扱えるようにしましょう。

参考リンク

SQL Server 解説用イメージ

0 件のコメント:

コメントを投稿