高校化学2913383 views
高校国語785655 views
ヒストリア284143 views
小学社会308636 views
いろは2986023 views
中学社会667106 views
小学理科717236 views
数学講師2852771 views
高校日本史189857 views
中学理科1626207 views
Help
Tools

English

MySQL の RIGHT JOIN で右側のテーブルを基準に結合する

LEFT JOIN が左側のテーブルを基準にすべての行を残すのに対し、RIGHT JOIN は右側のテーブルを基準にします。このロールではすでに LEFT JOIN を扱っていますが、RIGHT JOIN を理解しておくと、クエリの組み立て方の選択肢が広がります。

RIGHT JOIN の基本構文

この記事では、以下の 2 つのテーブルを使って説明を進めます。

カラム説明
id社員 ID1, 2, 3
name社員名田中, 鈴木
department_id所属部署 ID10, 20

これが employees(社員)テーブルです。各社員が department_id で部署に紐づいています。

カラム説明
id部署 ID10, 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_namedepartment_name
田中営業部
鈴木開発部
NULL総務部

departments のすべての行が残り、社員がいない総務部は employee_name が NULL になっています。これが RIGHT JOIN の基本的な動作です。

LEFT JOIN

FROM の直後に書いたテーブル(左側)を基準にする。左側の全行が保持され、右側に一致がなければ NULL になる。

RIGHT JOIN

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注文 ID1, 2, 3
customer_id顧客 ID100, 200
product_id商品 ID50, 60
カラム説明
id商品 ID50, 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 に統一しているケースが多いのも事実です。

LEFT JOIN に統一する方針

基準テーブルが常に左側になるため、読み手が結合の方向を迷わない。多くのチームやコーディング規約で採用されている。

RIGHT JOIN も許容する方針

既存クエリの構造を維持したまま結合を追加できる。テーブル順の入れ替えによる意図しないバグを防げる場面がある。

どちらの方針を採るにせよ、大切なのは「どのテーブルを基準にしているか」をクエリから明確に読み取れることです。エイリアスや適切なコメントで意図を示しておけば、RIGHT JOIN でも LEFT JOIN でも保守性を損なうことはないでしょう。