8. クエリの結合
- 8.1. UNION 演算子
- 8.2. INTERSECT 演算子
- 8.3. EXCEPT 演算子
クエリの結合とは、2つのクエリの出力結果を和、差、積、の 3 種類の方法で結合することです。和結合は「UNION 演算子」、積結合は「INTERSECT 演算子」、差結合は「EXCEPT 演算子」を用います。
2つのクエリの出力結果を結合することから、それぞれのクエリから出力される列は比較可能なものでなければなりません。データ型と列数が一致しなければ、クエリを結合することはできません。
ここでは、これらの演算子を用いた例を簡単に説明するために、次の 2つのテーブルを想定します。ある自動車メーカーの製品を取り扱う販売店の商品テーブルです。簡略化のため、製品名の列のみを示します。取り扱い製品表の名前を、BLUE 販売店のものは「BLUE」、RED 販売店のものは「RED」とします。
BLUE 販売店
|
RED 販売店
|
8.1. UNION 演算子
UNION 演算子は、2つのクエリの出力を和結合します。すなわち、2つのクエリの結果を結合し、そこから重複する行を削除します。次の図の黄色の部分が、「QUERY A」と「QUERY B」の和集合です。
sample.20-1 はテーブル BLUE とテーブル RED から、この二つの販売店が取り扱っている製品を出力するものです。
-- sample.20-1 --/* UNION */ SELECT * FROM BLUE UNION SELECT * FROM RED ;
実行結果
製品名 ────────── AVENILE PRIMERA GLOLIA STAJIA CEDRIK BLUE BARD DATSON PRESAJU LAULEL TERANO SANNY SKYLINN
samle.20-1 の出力結果から分かるように、重複する製品は表示されません。重複を削除しない場合は、「UNION ALL」と記述します。sample.20-2 は、テーブル BLUE とテーブル RED から重複するものもすべて出力するものです。
-- sample.20-2 --/* UNION ALL */ SELECT * FROM BLUE UNION ALL SELECT * FROM RED ;
実行結果
製品名 ────────── AVENILE PRIMERA GLOLIA STAJIA CEDRIK BLUE BARD DATSON PRESAJU LAULEL TERANO GLOLIA CEDRIK DATSON LAULEL TERANO SANNY SKYLINN
実習課題 1
販売管理データベースから、1月始めから 3月末までの受注で、各月の売上台数を表示させる SQL 文を記述しなさい。
- 月名と売上台数を表示すること。
8.2. INTERSECT 演算子
INTERSECT 演算子は、2つのクエリの出力を積結合します。すなわち、2つのクエリの結果から同じものだけを出力するものです。次の図における黄色の部分が、「QUERY A」と「QUERY B」の積集合です。
sample.20-3 は、BLUE 販売店と RED 販売店の両方で扱っている製品名を出力するものです。
-- sample.20-3 --/* INTERSECT */ SELECT * FROM BLUE INTERSECT SELECT * FROM RED ;
実行結果
製品名 ────────── GLOLIA CEDRIK DATSON LAULEL TERANO
8.3. EXCEPT 演算子
EXCEPT 演算子は、2つのクエリの出力の差結合します。次の図で言うと、「QUERY A」により出力された値の内、「QUERY B」で出力された値に含まれないものを出力します。または、「QUERY B」により出力された値の内、「QUERY A」で出力された値に含まれないものを出力します。
sample.20-4 は、BLUE 販売店では扱っているが、RED 販売店で扱っていない製品名を表示するものです。[BLUE-RED] のイメージです。
-- sample.20-4 --/* EXCEPT */ SELECT * FROM BLUE EXCEPT SELECT * FROM RED ;
実行結果
製品名 ────────── AVENILE PRIMERA STAJIA BLUE BARD PRESAJU
sample.20-5 は、RED 販売店では扱っているが、BLUE 販売店で扱っていない製品名を表示するものです。[RED-BLUE] のイメージです。
-- sample.20-5 --/* EXCEPT */ SELECT * FROM RED EXCEPT SELECT * FROM BLUE ;
実行結果
製品名 ────────── SANNY SKYLINN
なお、EXCEPT 演算子は「MINUS」と書くことも出来ます。
実習課題 2
販売管理データベースから、顧客に対する販売を担当した従業員が所属する営業所と、顧客を管理する営業所が同じかどうかを調べる目的で、顧客名、顧客を管理する営業所名、顧客に販売を担当した従業員名、その従業員が所属する営業所を表示させる SQL 文を記述しなさい。ただし、表示する顧客は担当従業員が所属する営業所と、顧客を管理する営業所が異なるもののみを表示するものとする。