SQL[JOINとWHEREのNULLに注意]テーブルを繋げてふるいにかける
作成日:2025-05-16
更新日:2025-05-16

NULLが変わる

NULLが変わる?

けっこう落とし穴になるの
構造の基本|JOINとWHEREの役割
JOINはつなげる

JOIN は FROM の一部
The JOIN clause is part of the FROM clause and defines how to combine tables into a virtual working table.
Joe Celko’s SQL for Smarties
JOINはFROMの一部で、テーブルを結合する方法を定義する
- FROMは「全体の森」を構成する
- JOINは「林」を合体させて、大きな森にする

FROM と JOIN で
全体の森を作る
WHEREで伐採する

WHERE の役割はフィルタ
つまり、木を伐採する
The WHERE clause removes rows that do not pass the search condition — that is, that do not test to TRUE (i.e., reject UNKNOWN and FALSE).
Joe Celko’s SQL for Smarties
WHEREは条件を満たさない行(UNKNOWNとFALSE)を除外する

条件に満たなければ
バサッと切る
JOIN と WHERE の関係性
項目 | 内容 |
---|---|
JOIN | FROMの一部。複数テーブルを「仮想作業テーブル」として結合する |
WHERE | 仮想テーブルの中で「条件を満たさない行を除外」するフィルタ処理 |
- FROM と JOINで「森」を作る
- テーブル同士を合体
- WHEREで「いらない木」を伐採する
- いらない行を取り除く
- FALSEやUNKNOWNも消える
NULLの扱いに注意|OUTER JOINとWHERE での違い
OUTER JOIN|一致したものがなければNULLになる
The unmatched columns in the unpreserved table
Joe Celko’s SQL for Smarties
are filled with NULL to complete the join and return rows with the right structure.
一致しない列は、NULLで補完される

NULL があれば
一致したものがなかった
と、わかる
WHERE|FROM 全体にかかる

JOIN に対して
WHERE するわけじゃない
The WHERE clause is applied to the working set in the FROM clause.
Joe Celko’s SQL for Smarties
WHEREはFROMで作られた作業セットに適用される
FROM は JOINを含む「working set」全部
たとえば
SELECT id, name
FROM A
LEFT JOIN B ON A.id = B.a_id
WHERE B.status = 'active'
↓ 常にカッコをつけておくとわかりやすい
SELECT id, name
FROM (A
LEFT JOIN B ON A.id = B.a_id) -- NULLは残したい
WHERE B.status = 'active' -- NULLは消える!
FROM句(仮想テーブルを構成)
├─ A
└─ LEFT JOIN B ON 条件 ← ここまでで仮想テーブル完成
↓
WHERE句で行を削除(NULL行含む)

JOIN と WHERE は別

つまり
JOIN で意図的に NULL を残しても
WHERE では容赦なく伐採するの
JOIN と WHERE で NULL の挙動が変わる
SELECT id, name
FROM (A
LEFT JOIN B ON A.id = B.a_id) -- NULLは残したい
WHERE B.status = 'active' -- NULLは消える!
項目 | 内容 |
---|---|
OUTER JOIN(LEFT JOIN) | 保存されない側の行も残す 結合できなかった列は NULL になる |
ON条件でNULL行ができる | JOIN ON の条件に一致しない行は、NULLになる |
WHERE条件でNULL行が消える | WHERE でフィルタすると、NULL行が除外される(TRUE評価じゃないため) |

ON では NULL残る
WHERE では NULL 消える
- JOINはテーブルをつなぐ
- WHEREは行をふるいにかける
- OUTER JOINでは「照合できなかった行」はNULLで残るが、
- WHEREでうっかり消える
補足|全体の実行順序と流れ
SQLの処理順(論理的な流れ)
順 | SQL | 作業内容 |
---|---|---|
① | FROM + JOIN | 複数の表を結合して「作業テーブル」を作る |
② | WHERE | 不要な行をフィルタで除く |
③ | GROUP BY | 集計の単位(グループ)を作る |
④ | HAVING | 集計結果に対してさらに条件をかける |
WHEREまではフィルタ処理、GROUP BY以降は集計&分析フェーズ
2025-05-16
編集後記:
この記事の内容がベストではないかもしれません。