更新履歴 [2019年11月04日]「同じテーブルで自己結合して階層扱いにする」を追加。

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

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

データベースに複数のテーブルがある場合に一回の参照で情報を合わせて表示することができ、そのことを結合(リレーション)と呼びます。
結合には大きく内部結合(INNER JOIN)と外部結合(OUTER JOIN)があります。
テーブルを結合するためには元となるテーブルが必要となります。
今回は次のように都道府県を登録したテーブル「d_pref」と観光地を登録したテーブル「d_site」を用意します。

都道府県テーブルには結合に利用するカラム「pref_id」を用意しています。
カラム「pref_id」は主キーとしており同じ値が重複することはありません。

都道府県テーブル

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

観光地テーブル

内部結合とは結合できた情報だけを表示する結合です。
SQL で実行する場合には"INNER JOIN"と記載します。
略すこともでき、"JOIN"だけでも"INNER JOIN"として結合します。
都道府県テーブルと観光地テーブルを内部結合すると下図のようになります。
結合できた結果だけ表示するので観光地テーブルに登録がない滋賀県、奈良県、和歌山県は表示されません。
また、観光地テーブルには京都府に該当するものが複数有り、"join"すると結合できた行が全て表示されます。

INNER JOIN の結果

外部結合とは主とするテーブルの情報を全て出すのと同時に、結合できた情報全てを表示する結合です。
"OUTER"は外部結合を表すグループ名で実際には"LEFT OUTER JOIN"と"RIGHT OUTER JOIN"の 2 種類に分類されます。
"OUTER"は略すことができ、"LEFT JOIN"と"RIGHT JOIN"でも結合できます。
"LEFT OUTER JOIN"は主とするテーブルの情報を全て出すのに対し、"RIGHT OUTER JOIN"は結合させる副とするテーブルの情報を全て出します。

下図は"LEFT OUTER JOIN"の結果です。
都道府県テーブルを主としているため結合できなかった滋賀県、奈良県、和歌山県の情報も出ており、該当する観光地情報がないため NULL になっています。
また、"INNER JOIN"の時と同じように京都府のように結合できた情報は全て表示します。

LEFT OUTER JOIN の結果

次に"RIGHT OUTER JOIN"の結果は下図のようになります。
副となる観光地テーブルの情報が全て表示されますが、このテーブルには滋賀県、奈良県、和歌山県に該当する情報がないためこれら 3 県は結果には出てきません。

RIGHT OUTER JOIN の結果