LEFT JOIN: 未購入・欠損も含めて見る
Stage 3 — 第3章 | データ分析基礎カリキュラム 推定学習時間:35〜45分 | 難易度:★★☆☆☆
この章で学ぶこと
INNER JOINは、両方のテーブルに一致する行だけを残すJOINでした。 一方で分析では、「購入した人だけ」ではなく「購入していない人」も含めて見たいことがあります。
そのようなときに使うのが LEFT JOIN です。 LEFT JOINは、左側のテーブルの行をすべて残し、右側に一致する行があれば情報を付け足します。
この章を終えると、こんなことができるようになります:
- LEFT JOINの基本形を書ける
- 未購入顧客を含めた分析ができる理由を説明できる
- JOIN後にNULLが出る理由を理解できる
WHEREの書き方でLEFT JOINの意味が変わることに注意できる
1. LEFT JOINは「左の表を残す」
LEFT JOINでは、FROM に書いた左側のテーブルを基準にします。
右側のテーブルに一致する行があればつなぎ、一致しなければ右側の列はNULLになります。
たとえば、顧客を基準に注文をつなぐとします。
SELECT
c.customer_id,
c.customer_name,
o.order_id,
o.order_date,
o.total_amount
FROM customers AS c
LEFT JOIN orders AS o
ON c.customer_id = o.customer_id;
このSQLでは、注文がない顧客も結果に残ります。
その場合、o.order_id や o.total_amount はNULLになります。
2. 未購入顧客を見つける
LEFT JOINがよく使われる場面の1つが、未購入顧客の抽出です。
SELECT
c.customer_id,
c.customer_name,
c.prefecture
FROM customers AS c
LEFT JOIN orders AS o
ON c.customer_id = o.customer_id
WHERE o.order_id IS NULL;
このSQLは、注文が1件もない顧客を取り出します。
考え方は次の通りです。
| 手順 | 内容 |
|---|---|
| 1 | customers を全員残す |
| 2 | 一致する注文があれば orders をつなぐ |
| 3 | 注文がない顧客は o.order_id がNULLになる |
| 4 | WHERE o.order_id IS NULL で未購入だけに絞る |
未購入者の分析は、施策を考えるうえで重要です。 購入者だけを見ていると、離脱や未反応の理由を見落とすことがあります。
3. 欠損や未対応のデータを確認する
LEFT JOINは、データの欠損確認にも使えます。
たとえば注文明細に入っている product_id が、商品マスタに存在するか確認したい場合です。
SELECT
oi.order_id,
oi.product_id,
p.product_name
FROM order_items AS oi
LEFT JOIN products AS p
ON oi.product_id = p.product_id
WHERE p.product_id IS NULL;
このSQLは、注文明細には存在するのに、商品テーブルに見つからない商品IDを探します。
このような確認は、分析結果を出す前のデータ品質チェックとして重要です。 商品名やカテゴリが欠けたまま集計すると、分類できない売上が発生するためです。
4. WHEREの位置に注意する
LEFT JOINでは、右側のテーブルに対する条件の書き方に注意が必要です。 次のSQLを考えます。
SELECT
c.customer_id,
c.customer_name,
o.order_id,
o.status
FROM customers AS c
LEFT JOIN orders AS o
ON c.customer_id = o.customer_id
WHERE o.status = 'completed';
このSQLでは、注文がない顧客は結果から消えます。
なぜなら、注文がない顧客の o.status はNULLであり、o.status = 'completed' を満たさないからです。
未購入顧客も残したい場合は、条件を ON 側に入れる方法があります。
SELECT
c.customer_id,
c.customer_name,
o.order_id,
o.status
FROM customers AS c
LEFT JOIN orders AS o
ON c.customer_id = o.customer_id
AND o.status = 'completed';
このSQLでは、完了注文だけをつなぎますが、完了注文がない顧客も残ります。
5. INNER JOINとの使い分け
INNER JOINとLEFT JOINは、分析対象をどう定義するかで使い分けます。
| 目的 | 向いているJOIN |
|---|---|
| 注文した顧客だけを見たい | INNER JOIN |
| 全顧客を基準に購入有無を見たい | LEFT JOIN |
| 未購入顧客を探したい | LEFT JOIN |
| マスタに存在しないIDを探したい | LEFT JOIN |
「購入者の平均注文金額」を見たいならINNER JOINで十分なことがあります。 しかし「登録者のうち何人が購入したか」を見たいなら、未購入者も含める必要があります。
分析では、結果に含めたい母集団を先に決めることが大切です。
実務での使いどころ: まだ行動していない人も残す
LEFT JOINは、左側のテーブルを基準にして、右側に対応するデータがなくても行を残します。 実務では「未購入顧客」「未ログインユーザー」「まだ回答していない人」を見たいときに重要です。
SELECT
c.customer_id,
c.customer_name,
COUNT(o.order_id) AS order_count
FROM customers AS c
LEFT JOIN orders AS o
ON c.customer_id = o.customer_id
GROUP BY
c.customer_id,
c.customer_name;
このSQLでは、注文がない顧客も order_count = 0 として残せます。
INNER JOINにすると、注文がない顧客は消えてしまいます。
| 分析したいこと | LEFT JOINが役立つ理由 |
|---|---|
| 未購入顧客を探す | 注文がない顧客も残る |
| 施策未反応ユーザーを見る | 行動ログがない人も残る |
| 欠損マスタを探す | 対応先がない行を検出できる |
| CVRを計算する | 分母側を残せる |
LEFT JOINでは、WHERE句の書き方にも注意が必要です。 右側テーブルの条件をWHEREに置くと、結果的にINNER JOINのようになることがあります。
ミニ演習
次の分析で、LEFT JOINを使う理由を説明してください。
- 登録顧客のうち購入していない人を探す。
- 全商品について販売数を確認する。
- 登録者全体を分母にした購入率を作る。
- 右側テーブルの条件をWHEREに書くと危険な場合を説明する。
まとめ
| 構文 | 意味 | 例 |
|---|---|---|
LEFT JOIN |
左側のテーブルをすべて残してつなぐ | customers LEFT JOIN orders |
| 右側に一致なし | 右側の列はNULLになる | o.order_id IS NULL |
| 未購入抽出 | LEFT JOIN後にNULLを探す | WHERE o.order_id IS NULL |
| 条件の位置 | WHERE と ON で結果が変わることがある |
AND o.status = 'completed' |
この章のキーメッセージ: LEFT JOINは、購入者だけでなく未購入者や欠損も含めて分析するための重要な道具です。どのテーブルを基準にするかを意識して使いましょう。
この章の確認
- LEFT JOINで右側に一致する行がない場合、右側の列はどう表示されますか?
- 未購入顧客を抽出するSQLでは、なぜ
o.order_id IS NULLを使うのですか? WHERE o.status = 'completed'を書くと、未購入顧客が消える理由を説明してください。- INNER JOINとLEFT JOINを使い分ける基準を説明してください。