集合演算

UNION:テーブルの足し算。二つのテーブルに含まれていたレコードが全て網羅される。重複行を排除する。

postgres=# SELECT shohin_id, shohin_mei FROM Shohin UNION 
postgres-# SELECT shohin_id, shohin_mei FROM Shohin2;
 shohin_id |   shohin_mei   
-----------+----------------
 0006      | フォーク
 0009      | 手袋
 0005      | 圧力鍋
 0007      | おろしがね
 0008      | ボールペン
 0002      | 穴あけパンチ
 0001      | Tシャツ
 0003      | カッターシャツ
 0004      | 包丁
 0010      | やかん
(10 rows)

集合演算の注意事項

  1. 演算対象となるレコードの列数は同じであること
SELECT shohin_id, shohin_mei FROM Shohin UNION 
SELECT shohin_id, shohin_mei, hanbai_tanka FROM Shohin2;
ERROR:  each UNION query must have the same number of columns
LINE 2: SELECT shohin_id, shohin_mei, hanbai_tanka FROM Shohin2;
  1. 足し算の対象となるレコードの列のデータ型が一致していること
SELECT shohin_id, shohin_mei FROM Shohin UNION 
SELECT shohin_id, torokubi FROM Shohin2;
ERROR:  UNION types character varying and date cannot be matched
LINE 2: SELECT shohin_id, torokubi FROM Shohin2;

// データ型が一致していればレコードの列が違ってもエラーは出ない
SELECT shohin_id, shiire_tanka FROM Shohin UNION 
SELECT shohin_id, hanbai_tanka FROM Shohin2;
 shohin_id | shiire_tanka 
-----------+--------------
 0003      |         2800
 0001      |          500
 0005      |         5000
 0009      |          800
 0008      |             
 0002      |          500
 0010      |         2000
 0004      |         2800
 0003      |         4000
 0006      |             
 0002      |          320
 0001      |         1000
 0007      |          790
(13 rows)
  1. SELECT文はどんなものを指定してもいい、ORDER BY句は最後に一つだけ
postgres=# SELECT shohin_id, shohin_mei
postgres-# FROM Shohin
postgres-# WHERE shohin_bunrui = 'キッチン用品'
postgres-# UNION
postgres-# SELECT shohin_id, shohin_mei
postgres-# FROM Shohin2
postgres-# WHERE shohin_bunrui = 'キッチン用品'
postgres-# GROUP BY shohin_id;
 shohin_id | shohin_mei 
-----------+------------
 0004      | 包丁
 0005      | 圧力鍋
 0006      | フォーク
 0007      | おろしがね
 0010      | やかん
(5 rows)

ALLオプション:重複行を残す集合演算

SELECT shohin_id, shohin_mei FROM Shohin UNION ALL 
SELECT shohin_id, shohin_mei FROM Shohin2;
 shohin_id |   shohin_mei   
-----------+----------------
 0001      | Tシャツ
 0002      | 穴あけパンチ
 0003      | カッターシャツ
 0004      | 包丁
 0005      | 圧力鍋
 0006      | フォーク
 0007      | おろしがね
 0008      | ボールペン
 0001      | Tシャツ
 0002      | 穴あけパンチ
 0003      | カッターシャツ
 0009      | 手袋
 0010      | やかん
(13 rows)

INTERSECT:テーブルの共通部分の選択。二つのレコードの共通部分だけ抜き出す。

SELECT shohin_id, shohin_mei FROM Shohin INTERSECT 
SELECT shohin_id, shohin_mei FROM Shohin2;
 shohin_id |   shohin_mei   
-----------+----------------
 0002      | 穴あけパンチ
 0001      | Tシャツ
 0003      | カッターシャツ
(3 rows)

EXCEPT:レコードの引き算。どちらから引くかによって結果が変わる。

postgres=# SELECT shohin_id, shohin_mei FROM Shohin EXCEPT 
SELECT shohin_id, shohin_mei FROM Shohin2
ORDER BY shohin_id;
 shohin_id | shohin_mei 
-----------+------------
 0004      | 包丁
 0005      | 圧力鍋
 0006      | フォーク
 0007      | おろしがね
 0008      | ボールペン
(5 rows)