inner joinとouter join
ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い - Qiita
上記リンクの記事を何度か読んだことがあるのですが、 そもそもinner joinやouter joinについてよくわかっていなかったため、「includesしとけば万能そう」という理解しかできておりませんでした。 昨日、N+1問題につて調べ事をしている時に読み返していたのですが、やっぱり難しい。
なので今回きちんとinner joinとouter joinについて調べることにしました。
前提
以下のような2つのテーブルがあるとします。
usersテーブル
id | user_name |
---|---|
1 | 林 |
2 | 林2 |
3 | 林3 |
has_many :messages
messagesテーブル
id | message | user_id |
---|---|---|
1 | hello | 2 |
2 | hey! | 1 |
3 | yo! | 2 |
4 | wow | 5 |
belongs_to :users
inner joinとは
テーブル同士の内部結合です。
関連するレコード同士を結合して、関連のあるものだけをまとめてくれます。
関連先のないレコードに関してはまとめてくれません。
inner joinしたテーブルイメージ
id | message | user_id | id | user_name |
---|---|---|---|---|
1 | hello | 2 | 2 | 林2 |
2 | hey! | 1 | 1 | 林 |
3 | yo! | 2 | 2 | 林2 |
inner joinしたテーブルを作るためには以下のSQLを書きます。
SELECT * FROM messages INNER JOIN users ON messages.user_id = users.id
outer joinとは
テーブル同士の外部結合です。 関連先のないレコードに関してもまとめてくれます。 また、outer joinにはleft joinとright joinの2種類があります。
left join
left joinは従属する側のテーブル基準で外部結合します。 関連先のないレコードに関しては、nullの値を入れた形で結合します。
left joinしたテーブルイメージ
id | message | user_id | id | user_name |
---|---|---|---|---|
1 | hello | 2 | 2 | 林2 |
2 | hey! | 1 | 1 | 林 |
3 | yo! | 2 | 2 | 林2 |
4 | wow | 5 | null | null |
right join
right joinは従属される側のテーブル基準で外部結合します。
関連先のないレコードに関してはnullの値を入れた形で結合します。
right joinしたテーブルイメージ
id | message | user_id | id | user_name |
---|---|---|---|---|
1 | hello | 2 | 2 | 林2 |
2 | hey! | 1 | 1 | 林 |
3 | yo! | 2 | 2 | 林2 |
null | null | null | 3 | 林3 |
感想その他
joinについて少し理解ができたので、もう一度ActiveRecordのjoinsとpreloadとincludesとeager_loadの違いについて勉強し直します!!