Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

  1. トップページ
  2. SQL辞典
  3. LEFT JOIN / RIGHT JOIN

LEFT JOIN / RIGHT JOIN

片方のテーブルの全行を保持しながら結合する方法です。一致しない行にはNULLが入ります。

構文
-- LEFT JOIN:左テーブル(FROM側)の全行を保持して結合します。
SELECT 列名 FROM テーブル1
LEFT JOIN テーブル2 ON テーブル1.結合列 = テーブル2.結合列;

-- LEFT OUTER JOIN は LEFT JOIN と同じ意味です(OUTER は省略可)。
SELECT 列名 FROM テーブル1
LEFT OUTER JOIN テーブル2 ON テーブル1.結合列 = テーブル2.結合列;

-- RIGHT JOIN:右テーブル(JOIN側)の全行を保持して結合します。
SELECT 列名 FROM テーブル1
RIGHT JOIN テーブル2 ON テーブル1.結合列 = テーブル2.結合列;
INNER JOIN との違い
結合種別動作
INNER JOIN両テーブルに一致する行のみを取得します。どちらかに存在しない行は結果に含まれません。
LEFT JOIN左テーブル(FROM側)の全行を必ず含みます。右テーブルに一致しない場合、右テーブルの列はNULLになります。
RIGHT JOIN右テーブル(JOIN側)の全行を必ず含みます。左テーブルに一致しない場合、左テーブルの列はNULLになります。
サンプルコード
-- 全社員を取得します。部署未設定の社員も含みます(department列はNULLになります)。
SELECT e.name, d.department_name
FROM employees AS e
LEFT JOIN departments AS d ON e.department_id = d.id;

-- 一度も注文していない顧客を取得します(orders側がNULLの行を絞り込みます)。
SELECT c.name AS 顧客名, o.order_date
FROM customers AS c
LEFT JOIN orders AS o ON c.id = o.customer_id
WHERE o.id IS NULL;

-- 全部署を取得します。社員がいない部署も含みます。
SELECT d.department_name, e.name
FROM departments AS d
LEFT JOIN employees AS e ON d.id = e.department_id;

-- RIGHT JOIN で全部署を取得します(LEFT JOIN の左右を入れ替えた例)。
SELECT d.department_name, e.name
FROM employees AS e
RIGHT JOIN departments AS d ON e.department_id = d.id;
実行結果
-- SELECT e.name, d.department_name FROM employees AS e
-- LEFT JOIN departments AS d ON e.department_id = d.id; の結果例
-- +----------+------------------+
-- | name     | department_name  |
-- +----------+------------------+
-- | 田中太郎 | 開発部           |
-- | 鈴木花子 | 営業部           |
-- | 高橋美咲 | NULL             | ← 部署未設定の社員
-- +----------+------------------+
データベース別の書き方

『LEFT JOIN』・『RIGHT JOIN』の構文は主要なデータベースで共通して使用できます。

-- MySQL・PostgreSQL・SQL Server・Oracle・SQLite 共通
SELECT e.name, d.department_name
FROM employees AS e
LEFT JOIN departments AS d ON e.department_id = d.id;

SQLite は『LEFT JOIN』をサポートしていますが、『RIGHT JOIN』には対応していません(3.39.0 以降で対応)。古いバージョンの SQLite では『LEFT JOIN』でテーブルの順序を入れ替えることで代替できます。

概要

『LEFT JOIN』は実務で非常によく使われる結合です。「すべての○○を取得し、関連する△△があれば一緒に表示する」という要件に適しています。

一致しない行を検出する(存在しない行を探す)パターンでも『LEFT JOIN』が使われます。結合後に『WHERE 右テーブル.id IS NULL』で絞り込むことで、左テーブルにのみ存在する行(孤立レコード)を見つけることができます。

『RIGHT JOIN』は『LEFT JOIN』でテーブルの順番を入れ替えた場合と同じ結果が得られます。そのため実務では読みやすさの観点から『LEFT JOIN』に統一することが多いです。両テーブルの全行を保持したい場合は『FULL OUTER JOIN』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。