SQL界隈で時折ささやかれる言葉がある。
それは――「NULLは闇だ」。
この一見ジョークのような言葉、実はデータベースにおいてかなり深刻な問題を内包している。
この記事では「NULL」の哲学的な正体、そしてなぜエンジニアたちがNULLに恐怖すら覚えるのか、その理由を探っていこう。
NULLとは何か? それは「存在しないこと」の存在
まずNULLの定義から振り返ろう。
SQLにおけるNULLは、「値が存在しないことを示す特別なマーカー」だ。これは0でも空文字でもfalseでもなく、**「わからない」「定義されていない」**という意味。
つまりNULLとは「何かがある」わけではなく、「あるかどうかもわからない」状態なのだ。
これ、哲学的に言えば**“非存在の存在”**という非常に厄介な概念。
NULLの怖さ①:三値論理の罠
通常の論理演算(AND, OR, NOT)は、true/falseの2値で完結する。しかしSQLではNULLを含むと、そこに第3の値が現れる。
それが UNKNOWN(不明) だ。
例えば以下のような式:
SELECT * FROM users WHERE age > 18;
ここで age
が NULL のレコードはどうなるか?
答えは 除外される。なぜなら NULL > 18
は true でも false でもなく、「比較不能=UNKNOWN」だからだ。
つまり、条件式にNULLが絡むと、真か偽かすらわからないという状態に陥る。
NULLの怖さ②:比較ができない、ソートも罠
もうひとつNULLの闇が深いのは、「NULLはNULLとすら等しくない」点だ。
SELECT * FROM table WHERE column = NULL;
これは一見、NULLを含む行を取得できそうだが、何も返らない。
正しくは IS NULL
を使わなければならない。
また、ORDER BYでソートした場合、NULLの位置(先か後か)もRDBMSによって挙動が異なる。PostgreSQLでは NULLS FIRST
/ NULLS LAST
が指定できるが、MySQLではバージョンや設定によって変わる。
つまりNULLは、比較できず、等価でもなく、順序もあいまい。もはや「暗黒物質」と呼ぶにふさわしい存在である。
NULLの哲学:それは「知らないことを知っている」状態
NULLは一種のメタ情報だ。
「この値は、ないのではなく、“わからない”」と明示している。
たとえば、あるユーザーの birth_date
がNULLなら、それは「まだ入力されていない」のか「生年月日が非公開」なのか「そもそも存在しない」なのか、理由は不明だ。
つまりNULLは「わからない理由すらわからない」ことを示す、認識の限界に立つ存在なのである。
これ、ソクラテスが言った「自分が無知であると知っている人間が最も賢い」というやつに近くないだろうか?
NULLの取り扱い:設計者は“前提”を明示せよ
NULLを完全に避けるのは難しいが、影響を最小限に抑えるためには明示的な設計が必要だ。
- フィールドにNOT NULL制約をつける
- NULLの意味を仕様で定義する(例:未入力 vs 不明 vs 該当なし)
- WHERE句では
IS NULL
/IS NOT NULL
を忘れない - COUNTやAVGなどの集計関数はNULLを除外するので注意
NULLがあるとJOINの結果が想定外になることも多い。
つまり、NULLは設計者の想像力を試すテストでもある。
結論:「NULLは闇」だが、避けることはできない
NULLはただの欠損値ではない。それは、
**「データに対して“知らない”という知性を持つシステム」**の現れである。
だからこそ、雑に扱えば設計は崩壊するし、きちんと向き合えば設計の質を引き上げてくれる存在でもある。
NULLを怖がるな。ただし、尊重しろ。