CodeGym /コース /SQL SELF /`RIGHT JOIN` とその使い方

`RIGHT JOIN` とその使い方

SQL SELF
レベル 11 , レッスン 3
使用可能

まずは定義から始めよう。RIGHT JOIN は結合の一種で、右側のテーブルの全行(だから「ライト」って呼ばれる)を返して、左側は一致する行だけ返すんだ。もし左側のテーブルに右側のテーブルの行に対応するデータがなかったら、左側のカラムは NULL になるよ。

もう LEFT JOIN は知ってるよね?ほぼ同じだけど「鏡写し」みたいな感じ。違いはどっちのテーブルをメインにするかだけ。

RIGHT JOIN の構文

RIGHT JOIN の構文は LEFT JOIN とほぼ同じ。こんな感じ:

SELECT
    カラムたち
FROM 
    テーブル_左 RIGHT JOIN テーブル_右
ON 
    結合条件;

テーブルの順番に注意してね:

  1. 左側のテーブルRIGHT JOIN の前に書く;
  2. 右側のテーブルRIGHT JOIN の後に書く。

例えば、こんな2つのテーブルがあるとしよう:

students — 学生リスト:

student_id name
1 Otto
2 Maria
3 Alex

enrollments — 学生のコース登録記録:

enrollment_id course_name student_id
101 数学 1
102 情報科学 2
103 生物学 NULL

今、全ての登録記録と、もし学生がいればその情報も取得したい。学生が見つからなければ、学生情報のところは NULL になるよ。

RIGHT JOIN を使ったクエリはこんな感じ:

SELECT
    enrollments.enrollment_id,
    enrollments.course_name,
    students.name AS student_name
FROM 
    students RIGHT JOIN enrollments
    ON 
    students.student_id = enrollments.student_id;

結果:

enrollment_id course_name student_name
101 数学 Otto
102 情報科学 Maria
103 生物学 NULL

ここで、enrollments(右側のテーブル)の全ての行が結果に入ってるのが分かるよね。たとえ students(左側のテーブル)に一致がなくてもOK。

RIGHT JOINLEFT JOIN の比較

もう LEFT JOIN の動きが分かってるなら、「じゃあ RIGHT JOIN って要る?」って思うかも。なんで LEFT JOIN じゃダメなの?いい質問!違いと、RIGHT JOIN を選ぶ場面を見てみよう。

  1. データの方向

    • LEFT JOIN: 左側のテーブルの全行を返す。右側に一致がなくてもOK。
    • RIGHT JOIN: 右側のテーブルの全行を返す。左側に一致がなくてもOK。
  2. メインテーブルの選択 普通はどっちのテーブル(左か右)が大事か、クエリの書きやすさで LEFTRIGHT を選ぶよ。

  3. 等価性 どんな RIGHT JOIN も、テーブルの順番を変えれば LEFT JOIN で書き直せる。例えば:

    -- RIGHT JOIN
    SELECT *
    FROM students RIGHT JOIN enrollments
    ON students.student_id = enrollments.student_id;
    
    -- 等価な LEFT JOIN
    SELECT *
    FROM enrollments LEFT JOIN students
    ON students.student_id = enrollments.student_id;

だから、RIGHT JOIN って単語が好きじゃなければ、使わなくても全然OK!

いつ RIGHT JOIN を使う?

実際は RIGHT JOIN より LEFT JOIN の方がよく使われる。でも、こんな時は RIGHT JOIN が便利:

  • 右側のテーブルが大事(例えばそれがメインテーブルの場合)
  • クエリの順番的に右側に置きたい時
  • 既存のコードが RIGHT JOIN を使ってる場合

RIGHT JOIN のイメージ図

RIGHT JOIN をもっとイメージしやすくするために、図を見てみよう:

左側のテーブル            右側のテーブル
   [ A ] --------> [ 1 ] 
   [ B ] --------> [ 2 ]
   [ C ] --------> [ 3 ]
   [ D ]           [ 4 ]

RIGHT JOIN を使うと、右側のテーブルの全ての値と、それに対応する左側のデータが取得できる。左側にないものは NULL で埋まるよ。

実践課題

じゃあ、実際にやってみよう。課題はこちら:

テーブル departments(部署)と employees(従業員)がある:departments

department_id department_name
1 IT
2 営業
3 経理

employees

employee_id name department_id
101 Peter 1
102 Eva 2
103 Ron NULL

RIGHT JOIN を使って、全ての部署と、もしその部署に従業員がいればその人も、いなければ NULL になるクエリを書いてみて。

まずは自分で考えてみてから、答えを見てね。

課題の答え

クエリはこうなる:

SELECT
    departments.department_name,
    employees.name AS employee_name
FROM employees RIGHT JOIN departments
    ON employees.department_id = departments.department_id;

結果はこうなるよ:

department_name employee_name
IT Peter
営業 Eva
経理 NULL

RIGHT JOIN でよくあるミス

RIGHT JOIN を使うとき、初心者がよくやるミスはこんな感じ:

  1. ON の結合条件を忘れる。条件を書かないと、テーブルのデカルト積になってカオスになるよ。
  2. RIGHT JOINLEFT JOIN を混同する。テーブルの順番を間違えると、結果もおかしくなる。
  3. NULL の扱いを忘れるRIGHT JOIN の結果には NULL がよく出てくるから、ちゃんと解釈したり COALESCE() で置き換えたりしよう。

これで終わり!もう RIGHT JOIN の使い方も、RIGHT JOINLEFT JOIN の違いも分かったし、自分の課題に合った結合タイプを選べるはず。次のレクチャーでは FULL OUTER JOIN についてもっと詳しくやるよ。両方のテーブルの ぜーんぶ を結合するやつ。クエリ頑張ってね!

2
タスク
SQL SELF, レベル 11, レッスン 3
ロック未解除
シンプルな `RIGHT JOIN` の使い方
シンプルな `RIGHT JOIN` の使い方
2
タスク
SQL SELF, レベル 11, レッスン 3
ロック未解除
`RIGHT JOIN`を使ったフィルタリング
`RIGHT JOIN`を使ったフィルタリング
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION