MySQL 入門

MySQL RIGHT JOIN

MySQLにおける RIGHT JOIN(右外部結合)操作は、左側のテーブルに一致する行がない場合でも、右側のテーブルのすべての行を返します。左側のテーブルにマッチする項目がない行については、結果セット(リザルトセット)内の左側テーブルに属するすべてのカラムに NULL 値が表示されます。

このジョイン(結合)タイプは、特定の「右」テーブルにあるすべてのデータを取得しつつ、それに関連する「左」テーブルのデータも併せて確認したい場合に非常に有用です。

1. RIGHT JOINのメカニズムを理解する

RIGHT JOIN(別名:RIGHT OUTER JOIN)は、JOIN キーワードの右側に指定されたテーブルのすべての行が、確実に結果セットに含まれることを保証します。

  • 右テーブルのある行が、結合条件(ジョインコンディション)に基づき左テーブルと一致する場合、両方のテーブルのカラムがマージ(統合)されます。
  • 右テーブルのある行が、左テーブルに対応する一致項目を持たない場合、結果セットのその行における左テーブル側のカラムには NULL 値が入ります。

例えば、「Employees(従業員、左テーブル)」と「Departments(部門、右テーブル)」という2つのテーブルがあるシナリオを考えてみましょう。department_id に基づいてこれらを RIGHT JOIN すると、すべての部門がリストアップされます。各部門について、その部門に所属する従業員が表示されますが、もし従業員が一人もいない部門があっても、その部門は結果に残り、従業員に関するカラムは NULL と表示されます。

2. RIGHT JOINの構文

RIGHT JOIN の基本構文は以下の通りです。

SELECT
    columns -- 取得したいカラムを指定
FROM
    left_table -- LEFT JOINキーワードの前に指定されるテーブル
RIGHT JOIN
    right_table ON join_condition; -- このテーブルのすべての行が結果に含まれる
  • columns: 両方のテーブルから取得したいカラムを指定します。
  • left_table: RIGHT JOIN キーワードの前に記述されるテーブル。
  • right_table: RIGHT JOIN キーワードの後に記述されるテーブル。このテーブルのすべての行が結果に含まれます。
  • join_condition: left_tableright_table を紐付けるための条件。通常は共通のカラム(外部キーリレーションシップなど)に基づきます。

3. 詳細な例:プロジェクトと従業員のアサイン

ある企業で「Projects(プロジェクト)」と「ProjectAssignments(プロジェクト割り当て)」という2つのテーブルを使用していると仮定します。

  • Projects: 各プロジェクトの情報を格納。project_id(プライマリキー)と project_name
  • ProjectAssignments: プロジェクトに割り当てられた従業員を記録。assignment_id(プライマリキー)、project_id(Projectsを参照する外部キー)、employee_id

まず、これらのテーブルにサンプルデータを投入します。

-- Projectsテーブルの作成
CREATE TABLE Projects (
    project_id INT PRIMARY KEY,
    project_name VARCHAR(100)
);

-- データの挿入
INSERT INTO Projects (project_id, project_name) VALUES
(101, 'ウェブサイトのリニューアル'),
(102, 'モバイルアプリ開発'),
(103, 'データベース移行'),
(104, 'クラウドインフラ構築'),
(105, 'AI研究プロジェクト');

-- ProjectAssignmentsテーブルの作成
CREATE TABLE ProjectAssignments (
    assignment_id INT PRIMARY KEY,
    project_id INT,
    employee_id INT
);

-- データの挿入
INSERT INTO ProjectAssignments (assignment_id, project_id, employee_id) VALUES
(1, 101, 1001),
(2, 101, 1002),
(3, 102, 1003),
(4, 104, 1001);

ここで、すべてのプロジェクトとそれに関連するアサイン情報を確認するために RIGHT JOIN を実行します。現在、誰もアサインされていないプロジェクトも含め、すべてのプロジェクトをリストアップしたいと考えます。

SELECT
    P.project_name,
    PA.employee_id
FROM
    ProjectAssignments AS PA  -- これが左テーブル
RIGHT JOIN
    Projects AS P ON PA.project_id = P.project_id; -- これが右テーブル。すべての行を保持します。

このクエリの結果は以下のようになります。

project_nameemployee_id
ウェブサイトのリニューアル1001
ウェブサイトのリニューアル1002
モバイルアプリ開発1003
クラウドインフラ構築1001
データベース移行NULL
AI研究プロジェクトNULL

結果にはすべてのプロジェクト名が表示されています。「データベース移行」(ID 103)や「AI研究プロジェクト」(ID 105)のように、ProjectAssignments にエントリが存在しないプロジェクトについては、ProjectAssignments 由来の employee_id カラムに NULL が表示されています。

4. 実践的なユースケース:関連データのないレコードの検索

LEFT JOIN と同様に、RIGHT JOIN はしばしば WHERE 句と組み合わされ、右テーブルには存在するが左テーブルに一致する項目がないレコードを特定するために使用されます。

上記のプロジェクトの例を引き続き使用し、従業員が一人もアサインされていないプロジェクトを抽出してみましょう。

SELECT
    P.project_name
FROM
    ProjectAssignments AS PA  -- 左テーブル
RIGHT JOIN
    Projects AS P ON PA.project_id = P.project_id -- 右テーブル
WHERE
    PA.assignment_id IS NULL; -- 左テーブルにマッチしなかったレコードをフィルタリング

ここでは、WHERE PA.assignment_id IS NULL がフィルターとして機能します。右外部結合を行っているため、アサイン記録がないプロジェクトについては、PA テーブルのすべてのカラムが NULL になります。左テーブルのプライマリキー(この場合は assignment_id)が NULL かどうかをチェックすることで、まだ開始されていない(アサインがない)プロジェクトを正確に抽出できます。