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の違いについて勉強し直します!!