Join(内部結合)とLeft Join(外部結合)の違い
目次
背景
面接でタイトルの質問をされたので、覚えるためにまとめます。
結論
Join(内部結合)
どちらか一方のテーブルになければ複製されず表示されない。
Left Join(外部結合)
左の行は強制的に全て表示し、右テーブルには全ての値がNULLである行を生成して結合する
検証1.Join
例えば、以下のテーブルがあったとします。
usersテーブル
|id|name|
|---|---|---|
|1 | Bob |
2 | Alan |
3 | James |
postsテーブル
id | body | user_id |
---|---|---|
1 | Hello | 3 |
2 | Hi | 1 |
3 | Good | 2 |
4 | Why? | 2 |
現状では、idが2のuserが一つに対し、user_idが2のpostが二つあります.
ここでjoin(内部結合)を使って結合してみます.
SELECT *
FROM users -- 結合元の左テーブル
JOIN posts -- 結合先の右テーブル
ON users.id = posts.user_id -- 左テーブルのidと右テーブルのidが一致するもの
id | name | id | body | user_id |
---|---|---|---|---|
3 | James | 1 | Hello | 3 |
1 | Bob | 2 | Hi | 1 |
2 | Alan | 3 | Good | 2 |
2 | Alan | 4 | Why? | 2 |
usersテーブルの行が一つ増えます.
右テーブルに繋ぐべき行が複数ある場合、左テーブルの行を複製して結合します。
もし、右テーブルにつなぐべき行がない場合は、表示されません
表示されない例
usersテーブル
|id|name|
|---|---|---|
|1 | Bob |
| 2 | Alan |
| 3 | James |
| 4 | Tony |
postsテーブル
id | body | user_id |
---|---|---|
1 | Hello | 3 |
2 | Hi | 1 |
3 | Good | 2 |
4 | Why? | 2 |
結果
id | name | id | body | user_id |
---|---|---|---|---|
3 | James | 1 | Hello | 3 |
1 | Bob | 2 | Hi | 1 |
2 | Alan | 3 | Good | 2 |
2 | Alan | 4 | Why? | 2 |
検証2.Left Join
Left Joinは左の行は強制的に全て表示し、右テーブルには全ての値がNULLである行を生成して結合します.
例えばid:4 Tony
のPostレコードはないため,内部結合では表示されませんでした.
しかし Left Joinでは表示されていることがわかります.
usersテーブル
|id|name|
|---|---|---|
|1 | Bob |
| 2 | Alan |
| 3 | James |
| 4 | Tony |
postsテーブル
id | body | user_id |
---|---|---|
1 | Hello | 3 |
2 | Hi | 1 |
3 | Good | 2 |
4 | Why? | 2 |
結果
id | name | id | body | user_id |
---|---|---|---|---|
3 | James | 1 | Hello | 3 |
1 | Bob | 2 | Hi | 1 |
2 | Alan | 3 | Good | 2 |
4 | Tony | NULL | NULL | NULL |
同じように外部結合の中でもRight Joinと呼ばれるものもあるのですが、
Right Joinは右の行は強制的に全て表示し、左テーブルには全ての値がNULLである行を生成して結合します.
学んだこと
-
Join(内部結合)
は左テーブルと右テーブルで一致する要素のみ表示する -
Left Join(外部結合)
は左テーブルにある全ての行を表示し,右テーブルにNULLのレコードを生成する