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
参考書籍: