はじめに
- プログラミングでは真偽値は基本2値(
TRUE
,FALSE
)- SQLは3値(上記2位加えて
unknown
)ある - なぜか?
NULL
がいるから
- SQLは3値(上記2位加えて
で、本題です。
なぜ「= NULL」ではなく「IS NULL」と書くのか?
最初よくやりがちなSQL、これは失敗します。
SELECT * FROM tests WHERE col_1 = NULL
なぜか?
それは、NULLに比較述語を適用した結果が、常にunknownになるからです。
当然、クエリを実行した結果、出力されるデータはWHERE句の条件評価がtrueになった行のみです。
falseやunknownは選択されません。以下のように、全ての比較述語が同じように動作します。
col_1がどんな値であろうがなんだろうが、NULLと比較した段階でunknownになります。
-- 結果は全てunknown
1 = NULL
2 > NULL
3 < NULL
4 <> NULL
NULL = NULL
NULL > NULL
NULL < NULL
NULL <> NULL
絶対にtrueにはなりません。
なぜ NULLに比較述語を用いた結果が絶対にtrueにならないのか?
それは、NULLが値でも変数でもないからです。
NULLは「そこに値がない」ことを示すマークとか目印です。
仮にNULLが値であるならば、型をもたないといけません。
なぜなら、データベースで扱われる値は全て型を持つからです。
SQL文中の値は対応付けられたデータ型を持っています。
なので、値じゃないNULLは何と比較しても結果はtrueでもfalseでもない、結果が分からないのでunknownとなります。
今後、何度か「3値理論とNULL」について書く予定です。本記事の内容はそれの基本知識になるので覚えておきます。
参照
60 - 64p
アウトプット100本ノック実施中