SQLのNULLがハマる理由と正しい使い分け
SQL を書いていて、「あれ、データが返ってこない?」そんな経験、私たちはよくあります。とくに
NULL が絡むと、一見正しく見えるクエリでも動きが止まることがあります。
たとえば JOIN した行が急に欠ける。
= NULL と書いたら まったく一致しない。
クラウド DWH に移行した瞬間に COALESCE の挙動が変わる──。
どれも珍しくありません。
NULL は「値がない」という単純な存在に見えて、その裏側では 3値論理(TRUE / FALSE / UNKNOWN) が働き、私たちが意図しない結果を生みます。
本記事では、IS NULL/= NULL/COALESCE を中心に、よくあるハマり方を整理しながら、実務で安全に書けるクエリ設計をまとめます。
現場で同じ悩みにぶつかったとき、迷わず前に進めるはずです。
(SQLの基本や実践的な使い方については『初心者向けSQL講座|SELECT文の書き方と実行順を完全解説』もご参照ください)
用語解説:SQL
データベースを操作するための言語。データの検索・更新・削除などを行う。用語解説:NULL
値が未定義・存在しないことを示す特別な値。空文字や0とは異なる。用語解説:JOIN
複数のテーブルを結合し、関連するデータをまとめて取得するSQLの機能。用語解説:COALESCE
複数の値のうち、最初にNULLでない値を返すSQL関数。NULL置換に使う。用語解説:DWH(データウェアハウス)
大量データを蓄積・分析するための専用データベース。用語解説:3値論理
TRUE(真)・FALSE(偽)・UNKNOWN(不明)の3つで論理判定する仕組み。NULLが絡むとUNKNOWNになる。
1. SQLのNULLがハマる3つの理由
1-1. NULLは“Unknown”を持つ特別な値
NULL は「値が存在しない/不明」を表します。そのため比較結果は TRUE / FALSE / UNKNOWN の三択になります。
たとえば次の比較はすべて UNKNOWN です。
SELECT * FROM t WHERE col = NULL;
UNKNOWN は WHERE 句で除外されるため、一致しないのではなく、“評価不能”として弾かれるのがポイントです。
用語解説:WHERE句
SQLで条件を指定し、必要なデータだけを抽出するための記述。用語解説:UNKNOWN
NULLとの比較結果として返る「不明」状態。TRUEでもFALSEでもない。
1-2. 空文字・0・FALSEと根本的に違う
NULL は「未定義」の状態です。
以下の値とは意味が異なります。
- 空文字:
''(値はある) - 0:数値としてのゼロ(値はある)
- FALSE:論理値(値はある)
この違いを混同すると、NULL のまま比較が動かない問題に直面しやすくなります。
用語解説:空文字
文字列型で値が空(”)の状態。NULLとは異なり「値が存在する」扱い。用語解説:FALSE
論理値の「偽」。条件判定で使われる。
1-3. JOIN・集計で“気づかぬ抜け”が起きやすい
外部結合では一致しない行に 必ず NULL が入るため、後続処理でトラブルが起きがちです。
- LEFT JOIN:右側の欠損がすべて NULL
- GROUP BY:NULL を含む集計は想定外の値になることがある
- WHERE:NULL を含む比較は UNKNOWN → 行が抜ける
こうした「仕様としての罠」が、私たちを迷わせる原因です。
(JOINの種類や実践例については『SQL JOINの基本から実践まで|INNER・LEFT・RIGHT・OUTER JOINの違いをわかりやすく解説』もご参照ください)
用語解説:LEFT JOIN
左側のテーブルの全行と、右側の一致する行を結合。右側に一致しない場合はNULLになる。用語解説:GROUP BY
データを指定した列ごとにグループ化し、集計するSQLの機能。
2. IS NULL/= NULL/COALESCEの正しい使い分け
2-1. NULL判定は必ず IS NULL
最も安全な書き方はこれです。
SELECT * FROM users WHERE deleted_at IS NULL;
= NULL は比較不可で UNKNOWN になります。
-- ❌ これは常に一致しない
SELECT * FROM users WHERE name = NULL;
NULL を扱う場面では、IS NULL / IS NOT NULL が絶対ルールと覚えておくと安全です。
用語解説:IS NULL / IS NOT NULL
値がNULLかどうかを判定するSQLの構文。NULL比較は必ずこれを使う。
2-2. NULLを置換したいときの関数の選び方
用途別に使い分けます。
- COALESCE:ANSI標準。複数引数に対応
- ISNULL:SQL Server
- IFNULL:MySQL
- NVL:Oracle
もっとも汎用性が高いのは COALESCE です。
SELECT COALESCE(phone, '') AS phone_number
FROM customers;
複数 DB をまたぐ環境では特に重宝します。
(COALESCEやサブクエリ・JOINの違いについては『SQLサブクエリは遅い?JOIN・CTEとの違いと高速化のベストプラクティス』もご参照ください)
用語解説:ANSI標準
SQLの国際標準規格。多くのDBで共通して使える。用語解説:ISNULL / IFNULL / NVL
DBごとに用意されたNULL置換関数。ISNULLはSQL Server、IFNULLはMySQL、NVLはOracleで使う。
3. DB別に違うNULLの挙動(RDBMS/DWH)
3-1. PostgreSQL:標準実装で扱いやすい
COALESCE をそのまま使え、挙動も標準SQLに近いです。
用語解説:PostgreSQL
オープンソースの高機能なRDBMS。標準SQLに忠実で、COALESCEなどもそのまま使える。
3-2. MySQL:空文字とNULLが混ざりやすい
前処理の段階で「空文字だと思ったら NULL だった」というケースが多いため、比較・JOINに注意が必要です。
用語解説:MySQL
世界的に利用されているオープンソースRDBMS。空文字とNULLの扱いに注意が必要。
3-3. Oracle:空文字をNULLとして扱う
文字列 '' が 自動で NULL に変換される仕様があります。
WHERE 条件や COALESCE の判定結果が他 DB と変わる原因です。
用語解説:Oracle
企業向けに広く使われる商用RDBMS。空文字を自動的にNULLとして扱う独自仕様がある。
3-4. BigQuery/Snowflake:型推論の違いに注意
クラウド DWH では、関数の評価順や戻り値の型がオンプレ RDBMS と異なることがあります。
移行時に「同じクエリが突然動かない」という報告が出るのはこのためです。
用語解説:BigQuery
Googleが提供するクラウド型DWH。SQLライクなクエリで大量データを高速処理できる。用語解説:Snowflake
クラウドベースのDWHサービス。型推論や関数の挙動が他DBと異なる場合がある。用語解説:型推論
データ型を自動的に判定する仕組み。DBごとに挙動が異なることがある。
4. NULLを前提にしたクエリ設計(ベストプラクティス)
私たちの現場で共有している、シンプルで強力なルールです。
4-1. WHERE/JOINは“NULL前提”で組み立てる
-- LEFT JOINで必ずNULLを考慮
SELECT u.id, COALESCE(p.name, '')
FROM users u
LEFT JOIN profiles p ON u.id = p.user_id;
外部結合は NULL が入りやすいため、COALESCE とセットで安全性が高まります。
用語解説:外部結合
LEFT JOINやRIGHT JOINなど、結合条件に一致しない場合でも片方のテーブルの全行を取得する方法。
4-2. 集計前にNULLを適切に処理する
NULL をそのまま集計すると「計算したのに値が返らない」状態が起きます。
SELECT SUM(COALESCE(amount, 0)) FROM payments;
事前に置換しておくことで結果が明瞭になります。
用語解説:SUM関数
指定した列の合計値を計算するSQL関数。NULLがあると合計に含まれないため注意。
4-3. テーブル設計段階でNULL思想を揃える
- NULL を許容する理由
- NOT NULL にしたい列
- デフォルト値の方針
これをドキュメント化しておくと、チーム全体の書き方が統一されます。
用語解説:NOT NULL
その列に必ず値が入るよう制約をかけるSQLの指定。NULLを許容しない。用語解説:デフォルト値
新規レコード作成時に自動で入る初期値。NULL回避や運用統一に役立つ。
5. 移行・統合でNULLが壊れやすい3ポイント
5-1. 型の違いからNULLが混入する
DB 間移行で文字列型が変わると、空文字→NULL へ変換されることがあります。
用語解説:型変換
データ型を別の型に変換すること。移行時にNULLが混入しやすい。
5-2. ETL/ELT工程で意図しない置換が起きる
NULL を空文字や0に誤変換すると、後続処理で意味が変わります。
用語解説:ETL/ELT
データ抽出・変換・格納(ETL)、または抽出・格納後に変換(ELT)する工程。NULLの扱いに注意。
5-3. 既存クエリの書き方が通用しない
COALESCE や ISNULL の扱いが違うため、移行後にロジックエラーが生まれやすい部分です。
(SQLエラーの原因や対策については『SQL Syntax Errorの原因と対処チェックリスト|今すぐ試せるエラー解決法』もご参照ください)
用語解説:ロジックエラー
プログラムやクエリの設計ミスによる意図しない動作。NULLの扱い違いで発生しやすい。
まとめ:NULLは敵ではなく“仕様”。理解すれば強力な武器になる
NULL は複雑ではありますが、仕様を理解すれば確実に扱えるようになります。
- NULL は Unknown を含む三値論理
- 判定は IS NULL が絶対
- 置換は COALESCE が最も汎用
- DB ごとの違いを把握しておく
- NULL 前提でクエリを設計する
どれも特別なテクニックではなく、現場で役立つ基本です。
ぜひ、お手元のクエリでも動作を試してみてください。