はじめに
業務で見かけたテーブルの結合を3つまとめてみました。
具体的な内容
大きく分けてLEFT JOIN(外部結合)、INNER JOIN(内部結合)、CROSS JOIN(クロス結合)の3つを紹介します。
今回利用するテーブルは下記のpostテーブルのカラム名「post_user_id 」とそれにカラム名「user_id」で紐づくuserテーブルになります。
userテーブル
user_id | user_name |
---|---|
1 | Aさん |
2 | Bさん |
3 | Cさん |
postテーブル
post_id | post_user_id | post_name |
---|---|---|
1 | 1 | 日記1 |
2 | 2 | 日記2 |
3 | 3 | 日記3 |
4 | 1 | 日記4 |
5 | 日記5 |
LEFT JOIN
LEFT JOINはFROM側のテーブルを軸に、紐づいていない(一致しない場合)もデータとして取得して結果を出力します。
今回の場合ですとpostテーブルのpost_idの5はuserテーブルと紐づいていませんが結果として、
userテーブルのuser_nameとuser_idがnullのまま出力されています。
select *
from sample_post
Left join sample_user
on sample_post.post_user_id = sample_user.user_id
結果
post_id | post_user_id | post_name | user_id | user_name |
---|---|---|---|---|
1 | 1 | 日記1 | 1 | Aさん |
2 | 2 | 日記2 | 2 | Bさん |
3 | 3 | 日記3 | 3 | Cさん |
4 | 1 | 日記4 | 1 | Aさん |
5 | 日記5 |
INNER JOIN
INNER JOINはON で指定した条件で絞り込んだ結果を出力します。
今回は「on sample_post.post_user_id = sample_user.user_id」でそれぞれの紐づくidがあるものだけを
絞り込み出力するため,post_idの5は出力されません。
select *
from sample_post
Inner join sample_user
on sample_post.post_user_id = sample_user.user_id
結果
post_id | post_user_id | post_name | user_id | user_name |
---|---|---|---|---|
1 | 1 | 日記1 | 1 | Aさん |
2 | 2 | 日記2 | 2 | Bさん |
3 | 3 | 日記3 | 3 | Cさん |
4 | 1 | 日記4 | 1 | Aさん |
CROSS JOIN
あまり見かけないですが、CROSS JOINは2つのテーブルを交差結合させてデータを取得します。
全てのカラムをかけ合わせ、すべての組み合わせ作成するイメージになります。
以下の例でwhere句で絞り込まない場合、全パターンの20レコードが結果として出力されますが、長くなりすぎるのでpost_idが5の場合に指定した場合の結果を記載しました。post_idが5のレコードが5つ出来上がり、それぞれ異なるレコードになっているのがわかります。
select *
from sample_post
CROSS JOIN sample_user
where sample_post.post_id = 5
結果
post_id | post_user_id | post_name | user_id | user_name |
---|---|---|---|---|
5 | 日記5 | 1 | Aさん | |
5 | 日記5 | 2 | Bさん | |
5 | 日記5 | 3 | Cさん | |
5 | 日記5 |
終わりに
joinにもさまざまな種類があることがわかりました。
用途に分けて使い分けっていきたいですね。(個人的にはCROSS JOINの面白い使い方を考えたいところです。)
訂正点などあればご指摘いただけると幸いです。