LoginSignup
1
1

More than 3 years have passed since last update.

SQLのjoinまとめ

Last updated at Posted at 2020-01-15

はじめに

業務で見かけたテーブルの結合を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の面白い使い方を考えたいところです。)
訂正点などあればご指摘いただけると幸いです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1