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 = NULLはtrueでもfalseでもなく、「評価できない(unknown)」になります。WHERE句ではunknownは除外されるため、結果が返らないのです。
このように、NULL = NULL も NULL <> NULL も評価できないため、
結果として NULL は NULL とすら等しくないことになります。
2. = NULL がうまく動かない理由
次のようなクエリを考えてみましょう。
SELECT * FROM users WHERE email = NULL;
これは一見、email が NULL の行を取得しそうですが、
実際には結果が返りません。
なぜなら 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;
この場合、email が NULL の行はカウントされません。
つまり「存在する値の件数」だけがカウントされます。
すべての行(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