PostgreSQL(テーブル結合)

price_tbl
idnameprice
101えんぴつ50
201せっけん200
102けしごむ100
kosuu_tbl
idkosuu
10110
1025
1037

内部結合

指定された列のデータが一致するものだけ取り出す。

    DB=> select A.列名, A.列名, B.列名, ... 
                    from テーブル1 A(別名)inner join テーブル2 B(別名)on A.列名 = B.列名;

    DB=> select A.id, A.name, A.price, B.kosuu
                    from price_tbl A inner join kosuu_tbl B on A.id = B.id;


    DB=> select 列名, 列名, ... from テーブル1 natural join テーブル2;

    DB=> select id, name, price, kosuu from price_tbl natural join kosuu_tbl;


    DB=> select 列名, 列名, ... from テーブル1 join テーブル2 using( 列名 );

    DB=> select id, name, price, kosuu from price_tbl join kosuu_tbl using( id );
idnamepricekosuu
101えんぴつ5010
102けしごむ1005

外部結合

結合するテーブルに該当データがなくても結合できる。該当データがない場合には、 NULL 値となる。左側にあるテーブルを基準とする left join 、右側にあるテーブルを基準とする right join がある。

・left join(join の左側にあるテーブルを基準)
    DB=> select A.列名, A.列名, B.列名, ...
                    from テーブル1 A(別名)left join テーブル2 B(別名)on A.列名 = B.列名;

    DB=> select A.id, A.name, A.price, B.kosuu
                    from price_tbl A left join kosuu_tbl B on A.id = B.id;


    DB=> select 列名, 列名, ... from テーブル1 natural left join テーブル2;

    DB=> select id, name, price, kosuu from price_tbl natural left join kosuu_tbl;


    DB=> select 列名, 列名, ... from テーブル1 left join テーブル2 using( 列名 );

    DB=> select id, name, price, kosuu from price_tbl left join kosuu_tbl using( id );
idnamepricekosuu
101えんぴつ5010
102けしごむ1005
201せっけん200NULL
・right join(join の右側にあるテーブルを基準)
    DB=> select A.列名, A.列名, B.列名, ...
                    from テーブル1 A(別名)right join テーブル2 B(別名)on A.列名 = B.列名;

    DB=> select B.id, A.name, A.price, B.kosuu
                    from price_tbl A right join kosuu_tbl B on A.id = B.id;


    DB=> select 列名, 列名, ... from テーブル1 natural right join テーブル2;

    DB=> select id, name, price, kosuu from price_tbl natural right join kosuu_tbl;


    DB=> select 列名, 列名, ... from テーブル1 right join テーブル2 using( 列名 );

    DB=> select id, name, price, kosuu from price_tbl right join kosuu_tbl using( id );
idnamepricekosuu
101えんぴつ5010
102けしごむ1005
103NULLNULL7

交差結合

該当するデータを全て組み合わせる。

    DB=> select A.列名, A.列名, B.列名, ...
                    from テーブル1 A(別名)cross join テーブル2 B(別名);

    DB=> select A.id, A.name, A.price, B.id, B.kosuu 
                    from price_tbl A cross join kosuu_tbl B;


    DB=> select * from テーブル1 cross join テーブル2;

    DB=> select * from price_tbl cross join kosuu_tbl;
idnamepriceidkosuu
101えんぴつ50 10110
201せっけん 200 10110
102けしごむ 100 10110
101えんぴつ 50 1025
201せっけん 200 1025
102けしごむ100 1025
101えんぴつ 50 1037
201せっけん 200 1037
102けしごむ 100 1037

ユニオン

検索結果を合わせたものを取得、重複データは含まれない。列数と、属性が同じでなくては成らない。

    DB=> select 列名, 列名, ... from テーブル1
                union
                select 列名, 列名, ... from テーブル2;
    DB=> select id from price_tbl union select id from kosuu_tbl order by id;
id
101
102
103
201

ユニオン(重複あり)

union の替わりに、union all を使用。

    DB=> select id from price_tbl union all select id from kosuu_tbl order by id;
id
101
101
102
102
103
201

intersect

検索結果から、共通部分を取得。

    DB=> select id from price_tbl intersect select id from kosuu_tbl order by id;
id
101
102

except

1番目の検索結果引く、2番目の検索結果を取得。

    DB=> select id from price_tbl except select id from kosuu_tbl order by id;
id
201