7.クエリの結合¶
クエリの結合とは、2つのクエリの出力結果を和、差、積、の 3 種類の方法で結合することです。和結合は「UNION 演算子」、積結合は「INTERSECT 演算子」、差結合は「EXCEPT 演算子」を用います。
2つのクエリの出力結果を結合することから、それぞれのクエリから出力される列は比較可能なものでなければなりません。データ型と列数が一致しなければ、クエリを結合することはできません。
ここでは、これらの演算子を用いた例を簡単に説明するために、次の 2つのテーブルを想定します。
受注表:

顧客表:

7.1. UNION 演算子¶
UNION 演算子は、2つのクエリの出力を和結合します。すなわち、2つのクエリの結果を結合し、そこから重複する行を削除します。次の図の黄色の部分が、「QUERY A」と「QUERY B」の和集合です。

sample-07-1 はテーブル 受注表 とテーブル 顧客表 から、この二つの顧客コードを出力するものです。
sample-07-1:
1 2 3 4 | /* UNION */ SELECT 顧客コード FROM 受注表 UNION SELECT 顧客コード FROM 顧客表; |
実行結果

sample-07-1 の出力結果から分かるように、重複する製品は表示されません。重複を削除しない場合は、「UNION ALL」と記述します。
sample-07-2 は、テーブル 受注表 とテーブル 顧客表 から重複するものもすべて出力するものです。
sample-07-2:
1 2 3 4 | /* UNION ALL */ SELECT 顧客コード FROM 受注表 UNION ALL SELECT 顧客コード FROM 顧客表; |
実行結果

7.2. INTERSECT 演算子¶
INTERSECT 演算子は、2つのクエリの出力を積結合します。すなわち、2つのクエリの結果から同じものだけを出力するものです。次の図における黄色の部分が、「QUERY A」と「QUERY B」の積集合です。

sample-07-3 は、受注表と 顧客表の両方で扱っている顧客コードを出力するものです。
sample-07-3:
1 2 3 4 | /* INTERSECT */ SELECT 顧客コード FROM 受注表 INTERSECT SELECT 顧客コード FROM 顧客表; |
実行結果

7.3. EXCEPT 演算子¶
EXCEPT 演算子は、2つのクエリの出力の差結合します。次の図で言うと、「QUERY A」により出力された値の内、「QUERY B」で出力された値に含まれないものを出力します。または、「QUERY B」により出力された値の内、「QUERY A」で出力された値に含まれないものを出力します。

sample-07-4: は、受注表では扱っているが、顧客表で扱っていない顧客コードを表示するものです。[受注表-顧客表] のイメージです。
sample-07-4:
1 2 3 4 | /* EXCEPT */ SELECT 顧客コード FROM 受注表 EXCEPT SELECT 顧客コード FROM 顧客表; |
実行結果

sample-07-5 は、顧客表では扱っているが、受注表で扱っていない顧客コードを表示するものです。[顧客表-受注表] のイメージです。
sample-07-5:
1 2 3 4 | /* EXCEPT */ SELECT 顧客コード FROM 顧客表 EXCEPT SELECT 顧客コード FROM 受注表; |
実行結果

なお、EXCEPT 演算子は「MINUS」と書くことも出来ます。
7.4 SQL文¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | SELECT 顧客コード FROM 受注表 UNION SELECT 顧客コード FROM 顧客表; SELECT 顧客コード FROM 受注表 UNION ALL SELECT 顧客コード FROM 顧客表; SELECT 顧客コード FROM 受注表 INTERSECT SELECT 顧客コード FROM 顧客表; SELECT 顧客コード FROM 受注表 EXCEPT SELECT 顧客コード FROM 顧客表; SELECT 顧客コード FROM 顧客表 EXCEPT SELECT 顧客コード FROM 受注表; |