hakeの日記

Windows環境でプログラミングの勉強をしています。

SQLite - カラム方向の結合(JOIN)

2つのテーブルの指定したカラムで結合することで2つのテーブルをカラム方向に広げたひとつのテーブルとして扱う

sqlite> select * from AAA;
tt          ii
----------  ----------
aaa         1
bbb         2
ccc         3
ddd         4
sqlite> select * from BBB;
ii          rr
----------  ----------
1           1.0
2           2.0
3           3.0
5           5.0

 
INNNER JOINまたはOUTER JOINにより、tt, ii, rrというカラムを持つひとつのテーブルに結合される。

内部結合(INNER JOIN)

結合相手のカラムに対応する値が無い場合は表示されない

-- AAA.iiと同じ値をBBB.iiに持つレコードを結合する
-- AAA.ii=4がBBB.iiに存在しないので表示されない
sqlite> select AAA.tt, BBB.rr from AAA inner join BBB on AAA.ii=BBB.ii;
tt          rr
----------  ----------
aaa         1.0
bbb         2.0
ccc         3.0


-- AAA.iiと異なる値をBBB.iiに持つレコードを結合する
sqlite> select AAA.tt, BBB.rr from AAA inner join BBB on AAA.ii<>BBB.ii;
tt          rr
----------  ----------
aaa         2.0
aaa         3.0
aaa         5.0
bbb         1.0
bbb         3.0
bbb         5.0
ccc         1.0
ccc         2.0
ccc         5.0
ddd         1.0
ddd         2.0
ddd         3.0
ddd         5.0


--対応する値が複数ある場合
sqlite> insert into BBB values(1,10.0);
sqlite> select AAA.tt, BBB.rr from AAA inner join BBB on AAA.ii=BBB.ii;
tt          rr
----------  ----------
aaa         1.0
aaa         10.0  --複数表示される
bbb         2.0
ccc         3.0

-- where句を追加
sqlite> select AAA.tt, BBB.rr from AAA inner join BBB on AAA.ii=BBB.ii where BBB.rr<10.0; 
tt          rr
----------  ----------
aaa         1.0
bbb         2.0
ccc         3.0

 

外部結合(OUTER JOIN)

SQLiteでは、LEFT OUTER JOINのみサポートしている。

-- AAA.iiと同じ値をBBB.iiに持つレコードを結合する
-- AAA.ii=4がBBB.iiに存在しないがNULLで表示される。
sqlite> select AAA.tt, BBB.rr from AAA left outer join BBB on AAA.ii=BBB.ii;
tt          rr
----------  ----------
aaa         1.0
bbb         2.0
ccc         3.0
ddd

-- AAA.iiと異なる値をBBB.iiに持つレコードを結合する
-- これはINNER JOINと同じ結果
sqlite> select AAA.tt, BBB.rr from AAA left outer join BBB on AAA.ii<>BBB.ii;
tt          rr
----------  ----------
aaa         2.0
aaa         3.0
aaa         5.0
bbb         1.0
bbb         3.0
bbb         5.0
ccc         1.0
ccc         2.0
ccc         5.0
ddd         1.0
ddd         2.0
ddd         3.0
ddd         5.0

 

全組み合わせ

ON節を付加しないとINNER JOINもLEFT OUTER JOINも全組み合わせを表示する

sqlite> select AAA.tt, BBB.rr from AAA inner join BBB;
tt          rr
----------  ----------
aaa         1.0
aaa         2.0
aaa         3.0
aaa         5.0
bbb         1.0
bbb         2.0
bbb         3.0
bbb         5.0
ccc         1.0
ccc         2.0
ccc         3.0
ccc         5.0
ddd         1.0
ddd         2.0
ddd         3.0
ddd         5.0
sqlite> select AAA.tt, BBB.rr from AAA left outer join BBB;
tt          rr
----------  ----------
aaa         1.0
aaa         2.0
aaa         3.0
aaa         5.0
bbb         1.0
bbb         2.0
bbb         3.0
bbb         5.0
ccc         1.0
ccc         2.0
ccc         3.0
ccc         5.0
ddd         1.0
ddd         2.0
ddd         3.0
ddd         5.0