SQL

【SQL基礎】INNER JOINとOUTER JOIN

アンチパターンの本を読んでいてINNER JOINとOUTER JOINが曖昧だなと思ったのでこれを機にアウトプットして定着させようと思いまとめていきます。

テーブル作成

下のようにサンプルテーブルを2つ用意しました。

shohinsテーブル

shohin_idshohin_meishohin_bunruihanbai_tankasiire_tankatorokubi
0001Tシャツ衣服10005002009-09-20
0002穴あけパンチ事務用品5003202009-09-11
0003カッターシャツ衣服40002800NULL
0004包丁キッチン用品300028002009-09-20

tenpo_shohinsテーブル

tenpo_idtenpo_meishohin_idsuryo
000A東京000230
000A東京000150
000B名古屋000230

INNER JOINの場合

SELECT * FROM shohins s INNER JOIN tenpo_shohins ts ON s.shohin_id = ts.shohid_id;
shohin_idshohin_meishohin_bunruihanbai_tankashiire_tankatorokubitenpo_idtenpo_meishohin_idsuryo
0001Tシャツ衣服10005002009-09-20000A東京000150
0002穴あけパンチ事務用品5003202009-09-11000A東京000230
0002穴あけパンチ事務用品5003202009-09-11000B名古屋000230

結果を見ると分かるようにもともとあったshohin_idが0003と0004のレコードが消えているのが分かります。また、0002のレコードが増えているのが分かります。shohinsテーブルのshohin_idとtenpo_shohinsテーブルのshohin_idが一致したもののみを返すことが分かります。これにより、元テーブルのレコードが消えることも増えることもあることが分かりました。

LEFT OUTER JOINの場合

SELECT s.shohin_id, s.shohin_mei, ts.tenpo_id, ts.tenpo_mei FROM shohins s LEFT OUTER JOIN tenpo_shohins ts ON s.shohin_id = ts.shohin_id;
shohin_idshohin_meitenpo_idtenpo_mei
0002穴あけパンチ000A東京
0001Tシャツ000A東京
0002穴あけパンチ000B名古屋
0003カッターシャツNULLNULL
0004包丁NULLNULL

結果を見ると結合できなかった行に関してはNULLが挿入されていることと、shohin_idが0002のレコードが重複していることが分かります。INNER JOINとはちがい、基準となるテーブル(この場合、LEFT OUTER JOINなので、shohinsテーブル)のレコードは必ず残ることが保証されることが分かります。ちなみにRIGHT OUTER JOINをした場合の結果がこちらです。

shohin_idshohin_meitenpo_idtenpo_mei
0001Tシャツ000A東京
0002穴あけパンチ000A東京
0002穴あけパンチ000B名古屋

この場合、tenpo_shohinsテーブルが必ず残り、一致しなかったshohinsテーブルの値は残りません。

さいごに

INNER JOINを使う場合は意図せずレコードが消えてしまう場合があることと、どちらの場合もレコードの重複には注意が必要だということが分かりました。
ここまで読んでいただきありがとうございました。よいSQLライフを。

ABOUT ME
sakai
三重出身の28歳。前職はメーカーで働いていて、プログラミングスクールに通って未経験からWeb業界に転職しました。Railsをメインで使っていて、AWSも少しできます。音楽を聞くこととYoutubeを見るのが好きです。最近はへきトラ劇場にハマってます