集合演算

SELECTの結果自体を対象として演算を行う。
これらの演算は、対象となるSELECTの結果が同じ列数で、対応する列が同じ型である必要がある。
列名は同じである必要はない。結果の列名は最初のSELECTの列名となる。

準備

  1. 次のSQLをファイルとして作成。(setup111.sql)

    
    
  2. ログイン画面から実行。

    oddtbs=> \i setup111.sql
    ...
    oddtbs=> select * from t1;
     a |   b
    ---+--------
     1 | DATA_1
     2 | DATA_2
     3 | DATA_3
     4 | DATA_4
     5 | DATA_5
     6 | DATA_6
    (6 rows)
    
    oddtbs=> select * from t2;
     c |   d
    ---+--------
     4 | DATA_4
     5 | DATA_5
     6 | DATA_6
     7 | DATA_7
     8 | DATA_8
     9 | DATA_9
    (6 rows)
    

UNION

UNIONは両方の結果を単純に足し合わせる。

SELECT文 UNION [ALL] SELECT文;

ALLが指定された場合、両方に重複した行も表示する。

ログイン画面から実行。

oddtbs=> select * from t1 union select * from t2;
 a |   b
---+--------
 1 | DATA_1
 2 | DATA_2
 3 | DATA_3
 4 | DATA_4
 5 | DATA_5
 6 | DATA_6
 7 | DATA_7
 8 | DATA_8
 9 | DATA_9
(9 rows)

oddtbs=> select * from t1 union all select * from t2;
 a |   b
---+--------
 1 | DATA_1
 2 | DATA_2
 3 | DATA_3
 4 | DATA_4
 5 | DATA_5
 6 | DATA_6
 4 | DATA_4
 5 | DATA_5
 6 | DATA_6
 7 | DATA_7
 8 | DATA_8
 9 | DATA_9
(12 rows)

INTERSECT

INTERSECTは両方の結果の共通部分となる。

SELECT文 INTERSECT SELECT文;

ログイン画面から実行。

oddtbs=> select * from t1 intersect select * from t2;
 a |   b
---+--------
 4 | DATA_4
 5 | DATA_5
 6 | DATA_6
(3 rows)

EXCEPT

EXCEPTは左の結果から右の結果を取り除く。

SELECT文 EXCEPT SELECT文;

ログイン画面から実行。

oddtbs=> select * from t1 except select * from t2;
 a |   b
---+--------
 1 | DATA_1
 2 | DATA_2
 3 | DATA_3
(3 rows)

oddtbs=> select * from t1 except (select * from t1 except select * from t2);
 a |   b
---+--------
 4 | DATA_4
 5 | DATA_5
 6 | DATA_6
(3 rows)