【SQL第8回】外部結合の仕組み:LEFT JOIN

SQL基礎講座 全10回(第8回)

【SQL第8回】外部結合の仕組み:LEFT JOIN

第7回のINNER JOINに続く、もう1つの超重要結合メソッド「外部結合(LEFT JOIN)」を学びます。結合先にデータがない行でも、主テーブルの情報を確実に1行も漏らさずに取得するテクニックを身につけましょう。

📌 SQL講座ロードマップ一覧(クリックで移動)

1. 左側のテーブルを絶対に守る「左外部結合」

前回の内部結合(`INNER JOIN`)は、「双方のテーブルに一致する共通IDが存在するデータのみ」を出力結果に残す仕組みでした。しかし実務では、「まだ1回も買い物をしたことがないユーザー」や「まだ注文が1件も入っていない新規商品」といったデータも、結合相手のいない状態のまま漏らさずに出力したいケースが多々あります。

これに使用するのが `LEFT JOIN`(左外部結合) です。

`FROM 主テーブル LEFT JOIN 結合テーブル` と書いた場合、左側にある「主テーブル」に書かれたデータ行は、右側の「結合テーブル」に合致するデータが有るか無いかに関わらず、**すべて強制的に結果に残されます。**

2. 結合できなかった箇所に入る「NULL」

`LEFT JOIN` を行った時、結合先のテーブルに一致するデータが存在しない箇所には、自動的に空を意味する特別なデータ `NULL`(ヌル) が格納されます。

例えば、「買い物履歴のない山田さん」のレコードに対して注文金額を出力しようとすると、山田さんの氏名は表示されますが、注文金額のカラムには `NULL` という値が表示されます。

3. 未購入者を含めて会員リストと注文を結合するSQLクエリ

以下のクエリは、`users`(会員情報)テーブルを基準として、全会員の氏名と、もしあればその人の注文履歴を結合して取得する、未購入者をあぶり出す際にも使われるコード例です。

left_join.sql
-- 会員全員を左側に残し、右側に注文履歴を外部結合する
SELECT
    u.name AS 会員名,
    o.order_date AS 注文日,
    o.amount AS 注文金額
FROM
    users AS u          -- 左側のテーブル(すべて残す)
LEFT JOIN
    orders AS o         -- 右側のテーブル(なければNULLが入る)
ON
    u.id = o.user_id;

📌 IS NULL を使った「未購入者」のあぶり出し

`LEFT JOIN` した結果、右側のカラムが `NULL` になっている人を抽出することで、「まだ1回も買い物をしていない会員のリスト」を簡単に作成できます。条件指定する際は `WHERE 注文金額 = NULL` と書くのではなく、**`WHERE o.amount IS NULL`** という特殊な判定キーワードを用いる必要がある点に注意してください。

✍️ 第8回 理解度チェック(問題)

SQLの外部結合(LEFT JOIN)で、結合先の右側のテーブルに対応するレコードが存在しない場合に、出力カラムに自動で格納される「空っぽ・データ不在」を意味する特別な状態値の名前は何でしょうか?(英大文字4文字で答えてください)

※この問題の解答と解説は、ページ最下部(まとめの前)に掲載しています。

5. まとめと次回予告

第8回の講義はお疲れ様でした!今回の重要ポイントを振り返りましょう。

  • `LEFT JOIN`(左外部結合)は、FROMの後に書いた主テーブルのレコードを確実にすべて残して結合する。
  • 結合相手のいないカラムには、空を意味する値 `NULL` が自動でセットされて出力される。
  • NULL判定を行うためには `=` ではなく `IS NULL` または `IS NOT NULL` を使用する。

次回(第9回)は、データの「取得(SELECT)」ではなく、登録されている既存のデータを書き換える「データの更新(UPDATE)とデータの削除(DELETE)」について、間違えると大惨事になる注意点を交えて学びます。お楽しみに!

🔑 第8回 理解度チェックの解答と解説

【解説】

正解は **`NULL`** です。 NULLは「0」や「空文字 ”」とは明確に異なり、「値が未定義である」「何もデータが入っていない」という空の状態を示します。そのため値の比較で `o.amount = NULL` のように記述しても正しく判定されず、必ず `o.amount IS NULL` と記述しなければなりません。