まずは定義から始めよう。RIGHT JOIN は結合の一種で、右側のテーブルの全行(だから「ライト」って呼ばれる)を返して、左側は一致する行だけ返すんだ。もし左側のテーブルに右側のテーブルの行に対応するデータがなかったら、左側のカラムは NULL になるよ。
もう LEFT JOIN は知ってるよね?ほぼ同じだけど「鏡写し」みたいな感じ。違いはどっちのテーブルをメインにするかだけ。
RIGHT JOIN の構文
RIGHT JOIN の構文は LEFT JOIN とほぼ同じ。こんな感じ:
SELECT
カラムたち
FROM
テーブル_左 RIGHT JOIN テーブル_右
ON
結合条件;
テーブルの順番に注意してね:
- 左側のテーブルは
RIGHT JOINの前に書く; - 右側のテーブルは
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 JOIN と LEFT JOIN の比較
もう LEFT JOIN の動きが分かってるなら、「じゃあ RIGHT JOIN って要る?」って思うかも。なんで LEFT JOIN じゃダメなの?いい質問!違いと、RIGHT JOIN を選ぶ場面を見てみよう。
データの方向
LEFT JOIN: 左側のテーブルの全行を返す。右側に一致がなくてもOK。RIGHT JOIN: 右側のテーブルの全行を返す。左側に一致がなくてもOK。
メインテーブルの選択 普通はどっちのテーブル(左か右)が大事か、クエリの書きやすさで
LEFTかRIGHTを選ぶよ。等価性 どんな
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 を使うとき、初心者がよくやるミスはこんな感じ:
ONの結合条件を忘れる。条件を書かないと、テーブルのデカルト積になってカオスになるよ。RIGHT JOINとLEFT JOINを混同する。テーブルの順番を間違えると、結果もおかしくなる。NULLの扱いを忘れる。RIGHT JOINの結果にはNULLがよく出てくるから、ちゃんと解釈したりCOALESCE()で置き換えたりしよう。
これで終わり!もう RIGHT JOIN の使い方も、RIGHT JOIN と LEFT JOIN の違いも分かったし、自分の課題に合った結合タイプを選べるはず。次のレクチャーでは FULL OUTER JOIN についてもっと詳しくやるよ。両方のテーブルの ぜーんぶ を結合するやつ。クエリ頑張ってね!
GO TO FULL VERSION