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_tableとright_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_name | employee_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 かどうかをチェックすることで、まだ開始されていない(アサインがない)プロジェクトを正確に抽出できます。