【SQL第8回】外部結合の仕組み:LEFT JOIN
第7回のINNER JOINに続く、もう1つの超重要結合メソッド「外部結合(LEFT JOIN)」を学びます。結合先にデータがない行でも、主テーブルの情報を確実に1行も漏らさずに取得するテクニックを身につけましょう。
1. 左側のテーブルを絶対に守る「左外部結合」
前回の内部結合(`INNER JOIN`)は、「双方のテーブルに一致する共通IDが存在するデータのみ」を出力結果に残す仕組みでした。しかし実務では、「まだ1回も買い物をしたことがないユーザー」や「まだ注文が1件も入っていない新規商品」といったデータも、結合相手のいない状態のまま漏らさずに出力したいケースが多々あります。
これに使用するのが `LEFT JOIN`(左外部結合) です。
`FROM 主テーブル LEFT JOIN 結合テーブル` と書いた場合、左側にある「主テーブル」に書かれたデータ行は、右側の「結合テーブル」に合致するデータが有るか無いかに関わらず、**すべて強制的に結果に残されます。**
2. 結合できなかった箇所に入る「NULL」
`LEFT JOIN` を行った時、結合先のテーブルに一致するデータが存在しない箇所には、自動的に空を意味する特別なデータ `NULL`(ヌル) が格納されます。
例えば、「買い物履歴のない山田さん」のレコードに対して注文金額を出力しようとすると、山田さんの氏名は表示されますが、注文金額のカラムには `NULL` という値が表示されます。
3. 未購入者を含めて会員リストと注文を結合するSQLクエリ
以下のクエリは、`users`(会員情報)テーブルを基準として、全会員の氏名と、もしあればその人の注文履歴を結合して取得する、未購入者をあぶり出す際にも使われるコード例です。
-- 会員全員を左側に残し、右側に注文履歴を外部結合する 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`** という特殊な判定キーワードを用いる必要がある点に注意してください。
SQLの外部結合(LEFT JOIN)で、結合先の右側のテーブルに対応するレコードが存在しない場合に、出力カラムに自動で格納される「空っぽ・データ不在」を意味する特別な状態値の名前は何でしょうか?(英大文字4文字で答えてください)
※この問題の解答と解説は、ページ最下部(まとめの前)に掲載しています。
5. まとめと次回予告
第8回の講義はお疲れ様でした!今回の重要ポイントを振り返りましょう。
- `LEFT JOIN`(左外部結合)は、FROMの後に書いた主テーブルのレコードを確実にすべて残して結合する。
- 結合相手のいないカラムには、空を意味する値 `NULL` が自動でセットされて出力される。
- NULL判定を行うためには `=` ではなく `IS NULL` または `IS NOT NULL` を使用する。
次回(第9回)は、データの「取得(SELECT)」ではなく、登録されている既存のデータを書き換える「データの更新(UPDATE)とデータの削除(DELETE)」について、間違えると大惨事になる注意点を交えて学びます。お楽しみに!
📖 SQLの基礎を全10回でマスターする
🔑 第8回 理解度チェックの解答と解説
【解説】
正解は **`NULL`** です。 NULLは「0」や「空文字 ”」とは明確に異なり、「値が未定義である」「何もデータが入っていない」という空の状態を示します。そのため値の比較で `o.amount = NULL` のように記述しても正しく判定されず、必ず `o.amount IS NULL` と記述しなければなりません。