MySQL の RIGHT JOIN で右側のテーブルを基準に結合する
LEFT JOIN が左側のテーブルを基準にすべての行を残すのに対し、RIGHT JOIN は右側のテーブルを基準にします。このロールではすでに LEFT JOIN を扱っていますが、RIGHT JOIN を理解しておくと、クエリの組み立て方の選択肢が広がります。
RIGHT JOIN の基本構文
この記事では、以下の 2 つのテーブルを使って説明を進めます。
| カラム | 説明 | 例 |
|---|---|---|
| id | 社員 ID | 1, 2, 3 |
| name | 社員名 | 田中, 鈴木 |
| department_id | 所属部署 ID | 10, 20 |
これが employees(社員)テーブルです。各社員が department_id で部署に紐づいています。
| カラム | 説明 | 例 |
|---|---|---|
| id | 部署 ID | 10, 20, 30 |
| department_name | 部署名 | 営業部, 開発部 |
こちらが departments(部署)テーブルです。employees の department_id が departments の id を参照する関係になっています。
RIGHT JOIN は、右側(JOIN の後に書いた)テーブルのすべての行を保持し、左側のテーブルに一致する行がなければ NULL で埋めます。
SELECT
e.name AS employee_name,
d.department_name
FROM employees e
RIGHT JOIN departments d
ON e.department_id = d.id;departments テーブルに「営業部(id=10)」「開発部(id=20)」「総務部(id=30)」の 3 部署があり、総務部にはまだ誰も配属されていないとしましょう。このクエリの結果は次のようになります。
| employee_name | department_name |
|---|---|
| 田中 | 営業部 |
| 鈴木 | 開発部 |
| NULL | 総務部 |
departments のすべての行が残り、社員がいない総務部は employee_name が NULL になっています。これが RIGHT JOIN の基本的な動作です。
FROM の直後に書いたテーブル(左側)を基準にする。左側の全行が保持され、右側に一致がなければ NULL になる。
JOIN の後に書いたテーブル(右側)を基準にする。右側の全行が保持され、左側に一致がなければ NULL になる。
LEFT JOIN との関係
実は、RIGHT JOIN で書けるクエリはテーブルの順序を入れ替えれば LEFT JOIN でも書けます。先ほどのクエリを LEFT JOIN で書き直してみましょう。
-- RIGHT JOIN 版
SELECT
e.name AS employee_name,
d.department_name
FROM employees e
RIGHT JOIN departments d
ON e.department_id = d.id;
-- LEFT JOIN 版(同じ結果)
SELECT
e.name AS employee_name,
d.department_name
FROM departments d
LEFT JOIN employees e
ON e.department_id = d.id;どちらも departments を基準にした結合で、結果は同じです。FROM 句に書くテーブルの順序が逆になっているだけにすぎません。
現場では LEFT JOIN のほうが圧倒的に多く使われます。「基準にしたいテーブルを FROM の直後に書き、LEFT JOIN で繋ぐ」というパターンが定着しているため、RIGHT JOIN を使うと読み手が一瞬戸惑うことがあります。ただし、RIGHT JOIN を使ったほうがクエリの意図が明確になる場面も存在します。
「どのテーブルを軸に据えているか」という設計上の狙いのこと。
RIGHT JOIN が自然になる場面
多くの場合は LEFT JOIN で事足りますが、既存のクエリに「右側のテーブルを基準にした結合を追加したい」ときに RIGHT JOIN が役立つことがあります。
ここでは先ほどのテーブルに加えて、orders(注文)テーブルと products(商品)テーブルを使います。
| カラム | 説明 | 例 |
|---|---|---|
| id | 注文 ID | 1, 2, 3 |
| customer_id | 顧客 ID | 100, 200 |
| product_id | 商品 ID | 50, 60 |
| カラム | 説明 | 例 |
|---|---|---|
| id | 商品 ID | 50, 60, 70 |
| product_name | 商品名 | りんご, みかん |
すでに複数の LEFT JOIN を繋いでいるクエリがあるとします。
SELECT
o.id AS order_id,
c.name AS customer_name,
p.product_name
FROM orders o
LEFT JOIN customers c
ON o.customer_id = c.id
RIGHT JOIN products p
ON o.product_id = p.id;orders と customers を LEFT JOIN で結合したうえで、products テーブルを基準にした RIGHT JOIN を追加しています。結果として、まだ一度も注文されていない商品も含めた一覧が得られます。
もしこれを LEFT JOIN だけで書こうとすると、テーブルの順序を全面的に組み替える必要が出てきます。既存クエリの構造を大きく変えたくない場合に、RIGHT JOIN をピンポイントで使うのは合理的な判断です。
NULL を使って「右側だけのデータ」を抽出する
RIGHT JOIN で左側に一致がない行は、左側テーブルのカラムがすべて NULL になります。この性質を利用して、「右側のテーブルにしか存在しないデータ」を抽出できます。
先ほどの employees と departments で、社員が一人も配属されていない部署を見つけてみましょう。
SELECT
d.department_name
FROM employees e
RIGHT JOIN departments d
ON e.department_id = d.id
WHERE e.id IS NULL;WHERE で左側テーブルの主キーが NULL の行だけを絞り込んでいます。結果は次のようになります。
| department_name |
|---|
| 総務部 |
左側テーブルのカラムに実データが入る。通常の結合結果として扱える。
左側テーブルのカラムがすべて NULL になる。IS NULL で判定すれば「右側にだけ存在するデータ」を抽出できる。
この「一致しないデータの抽出」は LEFT JOIN でも同じパターンで実現できます。LEFT JOIN の場合は右側テーブルのカラムが NULL になるので、WHERE 右側.id IS NULL と書く形になります。
複数テーブルでの RIGHT JOIN
RIGHT JOIN を複数回使うことも構文上は可能ですが、可読性の観点から推奨されません。
SELECT
a.name,
b.label,
c.category
FROM table_a a
RIGHT JOIN table_b b ON a.b_id = b.id
RIGHT JOIN table_c c ON b.c_id = c.id;RIGHT JOIN が連続すると「どのテーブルが最終的な基準なのか」が追いにくくなります。
RIGHT JOIN を連続で使う
基準テーブルの把握が困難になる
LEFT JOIN に書き直して可読性を確保
複数テーブルの外部結合では、基準テーブルを FROM の先頭に置き、LEFT JOIN で順番に繋いでいくほうが、クエリの流れを自然に読み下せます。
RIGHT JOIN を使うかどうかの判断基準
RIGHT JOIN は SQL 標準に含まれる正当な構文であり、使うこと自体に問題はありません。ただし、チームで開発している場合は LEFT JOIN に統一しているケースが多いのも事実です。
基準テーブルが常に左側になるため、読み手が結合の方向を迷わない。多くのチームやコーディング規約で採用されている。
既存クエリの構造を維持したまま結合を追加できる。テーブル順の入れ替えによる意図しないバグを防げる場面がある。
どちらの方針を採るにせよ、大切なのは「どのテーブルを基準にしているか」をクエリから明確に読み取れることです。エイリアスや適切なコメントで意図を示しておけば、RIGHT JOIN でも LEFT JOIN でも保守性を損なうことはないでしょう。













