【SQL】内部結合と外部結合について簡単な説明
※たぶん徐々に追記していきます。
今回のサンプルテーブル
membersテーブル
id | name | team_id |
---|---|---|
1 | レブロンジェームス | 1 |
2 | クリスポール | 2 |
3 | デビンブッカー | 2 |
4 | カールアンソニータウンズ | 3 |
5 | デマーデローザン | 4 |
teamsテーブル
id | name |
---|---|
1 | レイカーズ |
2 | サンズ |
3 | ウルブス |
内部結合
結合条件のカラムのフィールドの値が一致するレコードのみ取得する。
今回の例だと、membersテーブルのteam_idの値とteamsのidの値が一致したものを結合し、レコードを取得している。逆に一致していないとレコードを取得しない。デローザンのteam_idカラムのフィールド値の4はteamsテーブルのidカラムのフィールド値に存在しないため結合もできないし、レコードも取得されない。
SELECT * FROM members m JOIN teams t ON t.id = m.team_id
id | name | team_id | id | name |
---|---|---|---|---|
1 | レブロンジェームス | 1 | 1 | レイカーズ |
2 | クリスポール | 2 | 2 | サンズ |
3 | デビンブッカー | 2 | 2 | サンズ |
4 | カールアンソニータウンズ | 3 | 3 | ウルブス |
外部結合
基準のテーブルを決めて、そのテーブルの全レコードを取得し、内部結合同様に結合条件を利用して結合する。
LEFT JOIN
leftなのでmembers m LEFT JOIN teams tにおけるmembersテーブルを基準とする。
SELECT * FROM members m LEFT JOIN teams t ON t.id = m.team_id
id | name | team_id | id | name |
---|---|---|---|---|
1 | レブロンジェームス | 1 | 1 | レイカーズ |
2 | クリスポール | 2 | 2 | サンズ |
3 | デビンブッカー | 2 | 2 | サンズ |
4 | カールアンソニータウンズ | 3 | 3 | ウルブス |
5 | デマーデローザン | 4 | NULL | NULL |
基準であるmembersテーブルの全レコードを取得したが、m.team_id = 4 = t.id となるレコードがなかったため t.id と t.nameがnullとなっている。
内部結合の場合はそもそもm.id m.nameも取得されない。