銀河鉄道

SQL[JOINとWHEREのNULLに注意]テーブルを繋げてふるいにかける

サムネイル
The WHERE clause removesrows
JOIN と WHERE で
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.
JOINはFROMの一部で、テーブルを結合する方法を定義する

Joe Celko’s SQL for Smarties
FROM と JOIN で森づくり
  • 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).
WHEREは条件を満たさない行(UNKNOWNとFALSE)を除外する

Joe Celko’s SQL for Smarties

条件に満たなければ
バサッと切る

JOIN と WHERE の関係性

項目内容
JOINFROMの一部。複数テーブルを「仮想作業テーブル」として結合する
WHERE仮想テーブルの中で「条件を満たさない行を除外」するフィルタ処理
森と木の関係
  • FROM と JOINで「森」を作る
    • テーブル同士を合体
  • WHEREで「いらない木」を伐採する
    • いらない行を取り除く
    • FALSEやUNKNOWNも消える

NULLの扱いに注意|OUTER JOINとWHERE での違い

OUTER JOIN|一致したものがなければNULLになる

The unmatched columns in the unpreserved table
are filled with NULL to complete the join and return rows with the right structure.
一致しない列は、NULLで補完される

Joe Celko’s SQL for Smarties

NULL があれば
一致したものがなかった
と、わかる

WHERE|FROM 全体にかかる

JOIN に対して
WHERE するわけじゃない

The WHERE clause is applied to the working set in the FROM clause.
WHEREはFROMで作られた作業セットに適用される

Joe Celko’s SQL for Smarties

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 消える

WHERE は 行フィルタ
  • JOINはテーブルをつなぐ
  • WHEREは行をふるいにかける
  • OUTER JOINでは「照合できなかった行」はNULLで残るが、
  • WHEREでうっかり消える

補足全体の実行順序と流れ

SQLの処理順(論理的な流れ)

SQL作業内容
FROM + JOIN複数の表を結合して「作業テーブル」を作る
WHERE不要な行をフィルタで除く
GROUP BY集計の単位(グループ)を作る
HAVING集計結果に対してさらに条件をかける

WHEREまではフィルタ処理、GROUP BY以降は集計&分析フェーズ

著者

author
月うさぎ

編集後記:
この記事の内容がベストではないかもしれません。

記事一覧