SQLでは、複数のクエリ結果を結合したり、差分を取得したりするために、UNIONやEXCEPTを使用します。
これらは特に、データセットを操作して分析や集計を行う際に非常に便利です。今回は、それぞれの使い方と動作の違いを具体的な例とともに解説します。
UNIONとは?
UNIONは、複数のクエリの結果を結合し、重複する行を除外して返す操作です。
2つ以上のSELECT文で取得した結果を1つの結果セットにまとめたい場合に使用します。
特徴
- 重複行がある場合、自動的に1つにまとめられる。
- 各クエリで返す列数とデータ型が一致している必要がある。
- 結果の並び順は保証されないため、必要に応じて
ORDER BY
句を追加することが推奨されます。
UNIONの基本的な使用法
まず、2つのテーブルを考えます。
employees テーブル
first_name | last_name | department |
---|---|---|
John | Doe | Sales |
Jane | Smith | HR |
Michael | Brown | IT |
managers テーブル
first_name | last_name |
---|---|
John | Doe |
Sarah | Connor |
以下のクエリで、両テーブルに含まれる従業員とマネージャーの名前を1つのリストにまとめます。
SELECT first_name, last_name FROM employees
UNION
SELECT first_name, last_name FROM managers;
出力例
first_name | last_name |
---|---|
John | Doe |
Jane | Smith |
Michael | Brown |
Sarah | Connor |
John Doe
は両方のテーブルに存在しますが、UNION
によって重複が排除され、1度だけ表示されます。
UNION ALLの使用法
UNION ALLは、重複を除外せず、全ての結果をそのまま返す点でUNION
と異なります。
重複行を含めたい場合に使用します。
SELECT first_name, last_name FROM employees
UNION ALL
SELECT first_name, last_name FROM managers;
出力例
first_name | last_name |
---|---|
John | Doe |
Jane | Smith |
Michael | Brown |
John | Doe |
Sarah | Connor |
この場合、John Doe
は2度表示されます。
UNION ALL
では、重複行もそのまま返されるため、全てのデータが保持されます。
EXCEPTとは?
EXCEPTは、2つのクエリ結果のうち、最初のクエリに含まれるが、2つ目のクエリには含まれない行を返します。
これは、片方にのみ存在するデータを見つけたい場合に役立ちます。
特徴
- 最初のクエリの結果から、2つ目のクエリの結果を除外します。
- 各クエリで返す列数とデータ型が一致している必要があります。
- 両方のクエリ結果の重複行を除外した上で差分を取得します。
EXCEPTの使用法
先ほどと同じemployeesテーブルとmanagersテーブルを使用します。
SELECT first_name, last_name FROM employees
EXCEPT
SELECT first_name, last_name FROM managers;
このクエリは、employeesに存在するが、managersには存在しない従業員の名前を返します。
出力例
first_name | last_name |
---|---|
Jane | Smith |
Michael | Brown |
John Doe
は両方のテーブルに存在するため、EXCEPTによって除外されます。結果として、マネージャーではない従業員がリストアップされます。
UNIONとEXCEPTの使い分け
これまでの説明をまとめると、以下のように使い分けられます。
操作 | 動作 |
---|---|
UNION | 複数のクエリ結果を結合し、重複を排除した結果を返す |
UNION ALL | 複数のクエリ結果を結合し、重複を含む全ての行を返す |
EXCEPT | 最初のクエリ結果から、2番目のクエリ結果を引いた結果を返す。つまり、片方にのみ存在する行を返す |
まとめ
SQLのUNIONとEXCEPTは、データを結合したり差分を取得したりするための構文です。特に複数のテーブルからデータを取り出して集約したり、不要なデータを排除する処理において非常に有効です。