対応がない行も残して結合したい
LEFT JOIN は左側のテーブルの行を残し、一致した右側の情報を付けます。
SQL例の例
SELECT e.name AS employee_name,
d.name AS department_name
FROM employees AS e
LEFT JOIN departments AS d
ON e.department_id = d.id
ORDER BY e.id;この例で使うサンプル表を見る共通の架空データと、練習用の表を確認します
全20項目で共通の架空データです。salary は月給(円)。NULL は未設定を表します。結果の小数点以下の表示桁数は実行環境により異なります。
employees
| id | name | department_id | salary |
|---|---|---|---|
| 1 | 佐藤 | 1 | 300000 |
| 2 | 鈴木 | 2 | 400000 |
| 3 | 佐々木 | 1 | 350000 |
| 4 | 高橋 | 2 | 400000 |
| 5 | 田中 | NULL | 250000 |
| 6 | 伊藤 | 3 | NULL |
departments
| id | name |
|---|---|
| 1 | 営業 |
| 2 | 開発 |
| 3 | 人事 |
| 4 | 広報 |
employees.department_id が departments.id に対応します。表は説明用です。このサイト上でSQLは実行しません。
使い方を順番に確認する練習を始めるときは、この手順に沿って進めます
使い方
- 残したい employees を左に置く
- 部署IDで LEFT JOIN する
- 未所属の田中さんも残ることを確認する
結果の例
| employee_name | department_name |
|---|---|
| 佐藤 | 営業 |
| 鈴木 | 開発 |
| 佐々木 | 営業 |
| 高橋 | 開発 |
| 田中 | NULL |
| 伊藤 | 人事 |
一致しない右側の列は NULL です。右側の列を WHERE で絞ると、未一致の行を除いてしまう場合があります。
ONとWHEREの違いを結果で確認
全社員を残し、営業部だけ部署名を付ける
SELECT e.name AS employee_name,
d.name AS department_name
FROM employees AS e
LEFT JOIN departments AS d
ON e.department_id = d.id
AND d.name = '営業'
ORDER BY e.id;ON は「どの部署の行を結び付けるか」を決めます。営業部に一致しない社員も左側の employees にいるため残り、右側の department_name は NULL になります。鈴木さんや高橋さんが未所属に変わったわけではありません。元の表は変更されません。
| employee_name | department_name |
|---|---|
| 佐藤 | 営業 |
| 鈴木 | NULL |
| 佐々木 | 営業 |
| 高橋 | NULL |
| 田中 | NULL |
| 伊藤 | NULL |
営業部の社員だけを結果に残す
SELECT e.name AS employee_name,
d.name AS department_name
FROM employees AS e
LEFT JOIN departments AS d
ON e.department_id = d.id
WHERE d.name = '営業'
ORDER BY e.id;WHERE は結合した結果から行を絞ります。営業部以外の社員と、部署名が NULL の田中さんは条件を満たさず、2人だけが残ります。全社員を残したい目的には合いませんが、営業部の社員だけを表示したい場合にはこの結果が適切です。
| employee_name | department_name |
|---|---|
| 佐藤 | 営業 |
| 佐々木 | 営業 |
対応する部署が見つからない社員だけを探す
SELECT e.name AS employee_name,
d.name AS department_name
FROM employees AS e
LEFT JOIN departments AS d
ON e.department_id = d.id
WHERE d.id IS NULL
ORDER BY e.id;結合先の部署IDが NULL の行を取り出すと、このサンプルでは田中さんだけが残ります。実際のデータでは、社員の部署IDが未設定の場合だけでなく、対応する部署が存在しない場合も対象です。未一致の判定には、一致した行では必ず値が入る右側のキー列を使います。
| employee_name | department_name |
|---|---|
| 田中 | NULL |
うまくいかないときに確認するエラーや想定と違う結果が出たときの確認ポイント
うまくいかないとき
表や列が存在しないエラーは、サンプルの表名・列名と自分の環境が一致しているか確認します。構文エラーはデータベース製品の違いにも注意してください。
PostgreSQLの構文を基準にしています。MySQL・SQL Server・SQLiteなどでは、一部の構文や挙動が異なります。