🔖

SQLの IS NULL と = NULL の違いを解説

に公開

はじめに

SQLで「値が NULL かどうかを調べたい」とき、よく使われるのが IS NULL です。

ところが、次のように書いてしまうケースも見かけます。

SELECT * FROM users WHERE column = NULL;

この書き方は、期待通りには動きません

本記事では、IS NULL= NULL の違い、そして NULL を扱う際の注意点について解説します。

1. NULL は「何もない」ことを表す

SQLにおける NULL は、「0」や空文字('')とは異なり、
“値が存在しない”ことを示す特別な状態です。

重要なのは、NULL は他の値と比較できないという点です。

NULL = NULL    -- 評価不能(unknown)
NULL <> NULL   -- これも評価不能(unknown)

💡 SQLでは NULL = NULLtrue でも false でもなく、「評価できない(unknown)」になります。WHERE句では unknown は除外されるため、結果が返らないのです。

このように、NULL = NULLNULL <> NULL も評価できないため、
結果として NULLNULL とすら等しくないことになります。

2. = NULL がうまく動かない理由

次のようなクエリを考えてみましょう。

SELECT * FROM users WHERE email = NULL;

これは一見、emailNULL の行を取得しそうですが、
実際には結果が返りません

なぜなら email = NULL の評価結果は unknown になるため、
WHERE 句の条件としては「真でも偽でもない」と見なされ、該当する行が選ばれないのです。

3. 正しい書き方:IS NULL を使う

NULL を判定したい場合は、専用の構文 IS NULL を使います。

SELECT * FROM users WHERE email IS NULL;

これは、email の値が NULL の行を正しく取得できます。

逆に NULL ではない行を取得したい場合は、次のように書きます。

SELECT * FROM users WHERE email IS NOT NULL;

4. 集計関数と NULL の扱いに注意

NULL は比較だけでなく、集計でも特別扱いされます。

例えば、次のようなクエリを考えてみましょう。

SELECT COUNT(email) FROM users;

この場合、emailNULL の行はカウントされません
つまり「存在する値の件数」だけがカウントされます。

すべての行(NULL を含む)をカウントしたいときは、COUNT(*) を使うのが一般的です。

SELECT COUNT(*) FROM users;

このように、NULL を含むかどうかで集計結果が変わるため、使い分けには注意が必要です。

5. NULL を使う際の注意点

  • = NULL<> NULL は使用しない
  • IS NULL / IS NOT NULL を明示的に使う
  • 集計関数(例:COUNT(email))では、NULL を除外してカウントされる

まとめ

判定条件 意味 動作
column = NULL NULLとの等価比較 ❌ 評価されない
column IS NULL 値がNULLかどうかを確認 ✅ 正常動作
column IS NOT NULL 値がNULL以外かを確認 ✅ 正常動作

SQLでは NULL は“何もない”特別な値であり、通常の比較演算子(=<>)では扱えません
そのため、意図通りに判定・集計を行うためにも、IS NULL / IS NOT NULL を適切に使いましょう。

本記事が参考になれば幸いです。

Discussion