LoginSignup
2
1

More than 1 year has passed since last update.

【SQL】テーブル結合について(inner joinとouter join)

Posted at

はじめに

データベースからデータを取り出す際、複数のテーブルからデータを取り度すことも多いかと思います。
しかし、それぞれのテーブルから別々データを取り出して、実際に処理するときに合わせるようにすると、手間も時間もかかってしまいます。
そのため、複数のテーブルをまとめて、そこからデータを抽出するという手段を取ります。
これを「結合」と言います。

今回のテーブル

今回は以下のテーブルを例に、内部結合(inner join)と外部結合(outer join)について説明します。

teamsテーブル

id name
1 first
2 second
3 third
4 fourth

membersテーブル

id name team_id
1 hitomi 2
2 nibe 1
3 mikuni 4
4 yosoya 2
5 ikarugi 1
6 mutsuki 5

内部結合(inner join)

内部結合は、それぞれのテーブルの指定したカラムの値が一致するものだけを結合します。
membersテーブルとteamsテーブルから、membersテーブルのteam_idと teamsテーブルのidが一致するデータを取り出して結合する場合、以下のように書きます。

sample.sql
    SELECT * FROM members
INNER JOIN teams 
        ON members.team_id = teams.id;

このSQLリクエストにより、下の新しいテーブルができます。

id name team_id id name
1 hitomi 2 2 second
2 nibe 1 1 first
3 mikuni 4 4 fourth
4 yosoya 2 2 second
5 ikarugi 1 1 first

teamsテーブルのthirdは所属するメンバーがmembersテーブルにいないため含まれていません。また、membersテーブルのmutsukiも該当するチームがteamsテーブルにないため含まれていません。

「内部結合」では、一致する値を持たないデータはテーブルから除外されます。

外部結合(outer join)

外部結合は、片方のテーブルにしかないデータも取得します。
よく使うものとして「LEFT OUTER JOIN」と「RIGHT OUTER JOIN」があります。

LEFT OUTER JOIN

左側(SQL文でFROMの後)のテーブルを基に外部結合をします。

RIGHT OUTER JOIN

右側(SQL文でJOINの後)のテーブルを基に外部結合をします。

LEFT OUTER JOIN

sample.sql
         SELECT * FROM members
LEFT OUTER JOIN teams 
             ON members.team_id = teams.id;

結果は以下のようになります。

id name team_id id name
1 hitomi 2 2 second
2 nibe 1 1 first
3 mikuni 4 4 fourth
4 yosoya 2 2 second
5 ikarugi 1 1 first
6 mutsuki 5 NULL NULL

membersテーブルのmutsukiも該当するチームのデータが「NULL」のまま含まれているのがわかります。

RIGHT OUTER JOIN

sample.sql
          SELECT * FROM members
RIGHT OUTER JOIN teams 
              ON members.team_id = teams.id;

結果は以下のようになります。

id name team_id id name
1 hitomi 2 2 second
2 nibe 1 1 first
3 mikuni 4 4 fourth
4 yosoya 2 2 second
5 ikarugi 1 1 first
NULL NULL NULL 3 third

今度はteamsテーブルのthirdが所属するメンバーが無い状態で含まれているのがわかります。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1