SQLの IS NULL と = NULL の違いを解説
はじめに
SQLで「値が NULL
かどうかを調べたい」とき、よく使われるのが IS NULL
です。
ところが、次のように書いてしまうケースも見かけます。
SELECT * FROM users WHERE column = NULL;
この書き方は、期待通りには動きません。
本記事では、IS NULL
と = NULL
の違い、そして NULL
を扱う際の注意点について解説します。
NULL
は「何もない」ことを表す
1. SQLにおける NULL
は、「0」や空文字(''
)とは異なり、
“値が存在しない”ことを示す特別な状態です。
重要なのは、NULL
は他の値と比較できないという点です。
NULL = NULL -- 評価不能(unknown)
NULL <> NULL -- これも評価不能(unknown)
💡 SQLでは
NULL = NULL
はtrue
でもfalse
でもなく、「評価できない(unknown)」になります。WHERE
句ではunknown
は除外されるため、結果が返らないのです。
このように、NULL = NULL
も NULL <> NULL
も評価できないため、
結果として NULL
は NULL
とすら等しくないことになります。
= NULL
がうまく動かない理由
2. 次のようなクエリを考えてみましょう。
SELECT * FROM users WHERE email = NULL;
これは一見、email
が NULL
の行を取得しそうですが、
実際には結果が返りません。
なぜなら email = NULL
の評価結果は unknown
になるため、
WHERE
句の条件としては「真でも偽でもない」と見なされ、該当する行が選ばれないのです。
IS NULL
を使う
3. 正しい書き方:NULL
を判定したい場合は、専用の構文 IS NULL
を使います。
SELECT * FROM users WHERE email IS NULL;
これは、email
の値が NULL
の行を正しく取得できます。
逆に NULL
ではない行を取得したい場合は、次のように書きます。
SELECT * FROM users WHERE email IS NOT NULL;
NULL
の扱いに注意
4. 集計関数と NULL
は比較だけでなく、集計でも特別扱いされます。
例えば、次のようなクエリを考えてみましょう。
SELECT COUNT(email) FROM users;
この場合、email
が NULL
の行はカウントされません。
つまり「存在する値の件数」だけがカウントされます。
すべての行(NULL
を含む)をカウントしたいときは、COUNT(*)
を使うのが一般的です。
SELECT COUNT(*) FROM users;
このように、NULL
を含むかどうかで集計結果が変わるため、使い分けには注意が必要です。
NULL
を使う際の注意点
5. -
= 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