おひとり

できる限りひとりで楽しむための情報やプログラミング情報など。

【図解】INNER JOINとOUTER JOINの違い

TL;DR

  • INNER JOINは条件を満たすレコードを結合して抽出すること。条件を満たさないレコードは抽出されない。
  • OUTER JOINはテーブルAを指定した外部のテーブルBに結合する。条件に関わらず、結合先のテーブルBのデータは全て抽出される。結合出来なかったレコードのテーブルAのカラムはNULLとなる。

サンプルのデータベース

ここでは、サンプルを作るため3つのテーブルを考えます。
学校のクラブ活動に関するデータベースを作ります。

  • clubsテーブルは部活動の一覧を表します。
  • studentsテーブルは生徒の一覧を表します。部活動に所属していない生徒もいます。
  • club_rosterテーブルは部活動の名簿です。

f:id:hitoridehitode:20200616000706j:plain
ERD

それぞれのデータは次のようになっています。

clubs

f:id:hitoridehitode:20200615235935p:plain:w300
clubs

students

f:id:hitoridehitode:20200615235955p:plain:w300
students

club_roster

f:id:hitoridehitode:20200616000017p:plain:w300
club_roster

なお、サンプルコードはこちら。

https://gist.github.com/SRsawaguchi/8e19311dca1672267e9313a16a041495

INNER JOIN(内部結合)

条件を満たすレコードを結合して抽出すること。条件を満たさないレコードは抽出されません。 実例で考えてみましょう。

実例

  • 部活動に所属する生徒の情報を出力する。

SQLは次のようになります。

SELECT
    students.id AS student_id,
    students.name AS student_name
FROM
    club_roster
    INNER JOIN students ON club_roster.student_id = students.id
ORDER BY
    student_id;

実行結果

f:id:hitoridehitode:20200616000039p:plain:w300
students.id=8のRodrickは部活に所属していないから抽出されない。

club_rosterstudentsを結合します。

f:id:hitoridehitode:20200617231914j:plain
条件を満たすレコードのみ抽出する。

今回はstudents.id = 8である生徒、Rodrickはどんな部活にも所属していません。
そのため、club_rosterには、student_id = 8となるレコードは存在しません。 結合条件をみたしませんから、Rodrickは抽出されません。

OUTER JOIN(外部結合)

外部結合は内部結合の逆。
指定したテーブルを他のテーブルに結合すること。

実例

  • 生徒の一覧を表示する。ただし、部活動の情報も表示する。

今回は生徒の一覧を表示するものですが、部活動に所属している生徒については部活動も表示します。

SQLは次のようになります。

SELECT
    students.id AS student_id,
    students.name AS student_name,
    clubs.name AS club_name
FROM
    students
    LEFT OUTER JOIN club_roster ON students.id = club_roster.student_id
    LEFT OUTER JOIN clubs ON club_roster.club_id = clubs.id
ORDER BY
    student_id;

実行結果

f:id:hitoridehitode:20200616000143p:plain:w300
studentsに含まれるレコードは全て抽出。部活に所属してないRodrickの部活はNULLになる。

上記の通り、部活動に所属していないstudents.id = 8である生徒、Rodrickの情報も表示されています。

f:id:hitoridehitode:20200616004015j:plain
club_rosterをstudentsデーブル(OUTER)に結合する。
しかし、そのclub_nameNULLに設定されています。OUTER JOINの場合、該当するレコードがないために結合出来なかった場合、関連するカラムはNULLとなります。
そのため、

  • 何かの一覧を表示する場合に、存在しないかもしれない情報を表示する。

という場合に便利です。
さらに詳しい情報を知りたい場合は参考文献をご覧ください。

まとめ

  • INNER JOINは条件を満たすレコードを結合して抽出すること。条件を満たさないレコードは抽出されない。
  • OUTER JOINはテーブルAを指定した外部のテーブルBに結合する。条件に関わらず、結合先のテーブルBのデータは全て抽出される。結合出来なかったレコードのテーブルAのカラムはNULLとなる。

外部結合は、何かの一覧を表示する場合に、存在しないかもしれない情報を表示する場合に便利です。

参考文献

f:id:hitoridehitode:20190628072216j:plain:w200
RDBMS Logo