はじめに
データベースからデータを取り出す際、複数のテーブルからデータを取り度すことも多いかと思います。
しかし、それぞれのテーブルから別々データを取り出して、実際に処理するときに合わせるようにすると、手間も時間もかかってしまいます。
そのため、複数のテーブルをまとめて、そこからデータを抽出するという手段を取ります。
これを「結合」と言います。
今回のテーブル
今回は以下のテーブルを例に、内部結合(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が一致するデータを取り出して結合する場合、以下のように書きます。
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
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
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が所属するメンバーが無い状態で含まれているのがわかります。