複数のSELECT結果を組み合わせるには?SQL ServerのUNION・INTERSECT・EXCEPTの違いをわかりやすく解説
SQL Serverでは、複数のSELECT文の結果をまとめたり、共通部分・差分を取得したりする場合に集合演算子(Set Operators)を使用します。
代表的な演算子は UNION、INTERSECT、EXCEPT の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にのみ記述できる。
【第2章】【第1回】文字列関数まとめ ▶
目次へ
🔸次回から 第2章:関数と式(仕事で使う標準テク) に進みます。
文字列・数値・日付などの関数をまとめて理解し、SQLをより柔軟に扱えるようにしましょう。
参考リンク

0 件のコメント:
コメントを投稿