更新履歴 [2022年09月17日]「Windows に Python をインストールして実行する方法」を更新。

トップページ > 基礎知識 > SQL > 内部結合(INNER JOIN)と外部結合(LEFT/RIGHT JOIN)の違い

内部結合(INNER JOIN)と外部結合(LEFT/RIGHT JOIN)の違い


[初回公開] 2019年02月23日

データベースの操作で結合(リレーション)と呼ばれる 1 回の参照で複数のテーブルの情報を合わせて表示する機能があり、結合方法として用意されている内部結合(INNER JOIN)と外部結合(OUTER JOIN)の使い方と違いについて解説する。

内部結合(INNER JOIN)と外部結合(LEFT/RIGHT JOIN)の違い

1. データベースの結合(リレーション)とは

データベースの結合(リレーション)とは、データが入った 2 つ以上のテーブルを組み合わせて 1 つのテーブルのように取り扱う操作である。

テーブルを結合するためにはそれぞれのテーブルにある共通の値が用いられ、結合方法には主に内部結合(INNER JOIN)と外部結合(OUTER JOIN)の 2 通りで行われる。

2. テーブルの結合ができるテーブル

テーブルの結合ができるテーブルは、結合させたいテーブルそれぞれに共通の値を持っているがことが条件になる。

今回は次のように都道府県を登録したテーブル「d_pref」と観光地を登録したテーブル「d_site」を用意して内部結合と外部結合を行う。

都道府県テーブル「d_pref」には都道府県名の他にカラム「pref_id」を用意しており、この値を利用して他のテーブルと結合する。
また、カラム「pref_id」は主キー(プライマリーキー)の設定を入れているので他のレコードと同じ値が入って重複することはない状態である。

都道府県のデータが入ったテーブルの様子

観光地テーブル「d_site」にも結合に利用するカラム「pref_id」を用意している。
この値が都道府県テーブルと紐付くようになっており、例えば「大阪城」は大阪府にあるため「pref_id」は 1 を入れている。
観光地テーブルは 1 つの県内に複数の観光地があるためカラム「pref_id」は主キーにはしていない。

観光地データが入ったテーブルの様子

3. 内部結合(INNER JOIN)とは

内部結合(INNER JOIN)とは、複数のテーブルのデータで結合できた情報をだけを表示する操作である。
SQL で実行する場合には「INNER JOIN」と記載し、下図はテーブル「d_pref」に対してテーブル「d_site」を内部結合している。

内部結合(INNER JOIN)している様子

結合できた結果だけを表示するため観光地テーブル「d_site」に無い滋賀県、奈良県、和歌山県は表示されない。
また、観光地テーブル「d_site」には京都府に該当するものが複数有り、join すると結合できた行が全て表示される。

SQL の記載では JOIN だけで指定することも多く、JOIN だけ指定した場合は INNER JOIN として結合する。

4. 外部結合(OUTER/LEFT/RIGHT JOIN)とは

外部結合(OUTER/LEFT/RIGHT JOIN)とは、複数のテーブルのデータを結合の可否に関わらず結合先のデータを全て表示する操作である。
外部結合にはさらに LEFT OUTER JOIN と RIGHT OUTER JOIN の 2 種類に分類され、OUTER は外部結合を表すグループ名となっている。

SQL の記載では OUTER は略すことができ、LEFT JOIN または RIGHT JOIN の記載だけでも結合できる。
LEFT OUTER JOIN は主とするテーブルの情報を全て出すのに対し、RIGHT OUTER JOIN は結合させる副とするテーブルの情報を全て表示する。

外部結合(LEFT OUTER JOIN )している様子

上図は LEFT OUTER JOIN の結果となり、都道府県テーブル「d_pref」を主としているため結合できなかった滋賀県、奈良県、和歌山県の情報も表示されているのが確認できる。
また、結合する観光地のデータがないため NULL になっている。
加えて、内部結合(INNER JOIN)の時と同じように京都府は複数の観光地データがあるため結合できた情報は全て表示されている。

外部結合(RIGHT OUTER JOIN )している様子

次に RIGHT OUTER JOIN で外部結合した結果が上図のようになる。
副となる観光地テーブルの情報が全て表示されているが、このテーブルには滋賀県、奈良県、和歌山県に該当する情報がないためこれら 3 県は結果には出てきていないのが確認できる。

5. 内部結合と外部結合の違いのまとめ

内部結合と外部結合の違いのまとめとしては、結合できたデータだけを出したい場合は内部結合を利用し、結合に関わらずデータを全て出したい場合は外部結合を利用する。

内部結合と外部結合の違いのまとめ

また、外部結合には結合される側、もしくは結合する側のテーブルのどちらの情報を全て出すかを指定することができる。

関連記事

@webolve をフォローしてください