yagisukeのWebなブログ

フロントエンドとサーバーサイドをさまようエンジニア

SQLで集合演算にトライ 〜和集合/積集合/差集合について〜

SQLの集合演算についてまとめてみた

テーブル同士の集合演算について簡単に書き留めたので投稿。 集合演算は、和集合・積集合が一般的ですが、 差集合というのもあるらしいのでそちらについても記載しときます。

サンプルデータ

以下は説明で使用するテーブルです。
PERSONテーブル

NAME ADDRESS WORK
田中みほ 東京 モデル
潮田れいこ 福岡 元スポーツ選手
伴とみこ 熊本 歌手
吉瀬みちこ 福岡 女優


TOKYO_PERSONテーブル

NAME ADDRESS WORK
田中みほ 東京 モデル
上戸あや 東京 女優
平井りお 東京 アナウンサー

UNIONで和集合を求める

和集合は、UNIONという演算子を使います。
こんな感じ。

SELECT *
FROM PERSON
UNION
SELECT *
FROM TOKYO_PERSON;
NAME ADDRESS WORK
田中みほ 東京 モデル
潮田れいこ 福岡 元スポーツ選手
伴とみこ 熊本 歌手
吉瀬みちこ 福岡 女優
上戸あや 東京 女優
平井りお 東京 アナウンサー

PERSONとTOKYO_PERSONテーブルの和集合が出力されまます。 ここでポイントなのが、"田中みほ"さんの両テーブルのデータは、すべての列で完全に同一である重複データであるということです。
UNIONは和集合のため、重複しているデータは削除します。重複を削除させたくない場合は以下のようにUNIONにALLオプションをつけます。これはこの後説明する、積集合(INTERSECT)と差集合(EXCEPT)も同様です。

SELECT *
FROM PERSON
UNION ALL
SELECT *
FROM TOKYO_PERSON;
NAME ADDRESS WORK
田中みほ 東京 モデル
潮田れいこ 福岡 元スポーツ選手
伴とみこ 熊本 歌手
吉瀬みちこ 福岡 女優
田中みほ 東京 モデル
上戸あや 東京 女優
平井りお 東京 アナウンサー

INTERSECTで積集合を求める

積集合は、INTERSECTという演算子を使います。
PERSONとTOKYO_PERSONテーブルに共通するレコードが出力されます。

SELECT *
FROM PERSON
INTERSECT
SELECT *
FROM TOKYO_PERSON;
NAME ADDRESS WORK
田中みほ 東京 モデル

EXCEPTで差集合を求める

差集合は、EXCEPTという演算子を使います。
ORACLEの場合は、EXCEPTをMINUSに置き換えて読んでください。なお、ORACLEにはALLオプションはないそうです。

SELECT *
FROM PERSON
EXCEPT
SELECT *
FROM TOKYO_PERSON;
NAME ADDRESS WORK
潮田れいこ 福岡 元スポーツ選手
伴とみこ 熊本 歌手
吉瀬みちこ 福岡 女優

UNIONとINTERSECTはテーブルの順序は関係なく同一の出力結果となりますが、 四則演算と同じで、EXCEPTはテーブルの順序で出力結果が異なるという注意点があります。

順序を変えた四則演算

  • 和集合(UNION): 4 + 3 = 7, 3 + 4 = 7
  • 積集合(INTERSECT): 4 * 3 = 12, 3 * 4 = 12
  • 差集合(EXCEPT): 4 - 3 = 1, 3 - 4 = -1



参考書籍: