目次へ

8. クエリの結合

クエリの結合とは、2つのクエリの出力結果を和、差、積、の 3 種類の方法で結合することです。和結合は「UNION 演算子」、積結合は「INTERSECT 演算子」、差結合は「EXCEPT 演算子」を用います。

2つのクエリの出力結果を結合することから、それぞれのクエリから出力される列は比較可能なものでなければなりません。データ型と列数が一致しなければ、クエリを結合することはできません。

ここでは、これらの演算子を用いた例を簡単に説明するために、次の 2つのテーブルを想定します。ある自動車メーカーの製品を取り扱う販売店の商品テーブルです。簡略化のため、製品名の列のみを示します。取り扱い製品表の名前を、BLUE 販売店のものは「BLUE」、RED 販売店のものは「RED」とします。

BLUE 販売店
製品名
AVENILE
PRIMEPA
GLOLIA
STAJIA
CEDRIK
BLUE BARD
DATSON
PRESAJU
LAULEL
TERANO
           RED 販売店
製品名
GLOLIA
CEDRIK
DATSON
LAULEL
TERANO
SANNY
SKYLINN

8.1. UNION 演算子

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

「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」の積集合です。

「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」で出力された値に含まれないものを出力します。

「QUERY A」と「QUERY B」の差結合1
「QUERY A」と「QUERY B」の差結合2

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 文を記述しなさい。ただし、表示する顧客は担当従業員が所属する営業所と、顧客を管理する営業所が異なるもののみを表示するものとする。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp