商品データ相手にのめり込み、NULLと3値論理で見事にハマった初心者「あるある」です。😊
はじめに:たかが除外クエリ、されどNULL
SQLを勉強し始めた私は「要するにSQLで条件を書けば欲しいデータは取れるってことだよね?」とナメてかかってました。商品テーブルに対して NOT LIKE '%限定%'
を投げれば非限定商品だけ出る──はずが、出ない。出るべきものが出ない。え、これバグ?
結果的に3時間ほど四苦八苦して、原因は NULL による3値論理であることを学びました。気づいた瞬間は爽快さと脱力感が同居</strong。今回はその顛末を、日記風に振り返ります。
1. 問題の状況:商品データでNOT LIKEを実行
対象は社内の products
テーブル。商品名に「限定」という語を含まない商品だけ抽出したい、という単純な要望でした。自信満々に投げたクエリは次の通り。
SELECT * FROM products
WHERE product_name NOT LIKE '%限定%';
「これでOK!」と期待して実行したら──明らかに「限定」タグが入っているはずのデータがフィルタされずに混じってきたのです。どういうことだ、SQLよ。😵
2. 3時間の迷走:疑念は深まるばかり
最初は「クエリの書き方がおかしいのかな?」と疑い、あれこれ試しました:
- ワイルドカードの位置を変えてみる
- 大文字小文字の違いを考えて UPPER()/LOWER() を試す
- 同僚に「これってバグですか?」と聞いてみる(よくよく考えたら、うちの職場ではSQLなんか使ってきていないので「そもそもそれ何なの?」と聞かれる)
どの試みも結果は変わらず、時間だけが過ぎていきます。気づけば3時間。コーヒーが冷めては入れ直し、また冷めて……そんなループでした。
3. ふと目にした参考書に運命のページが
困り果てて参考書の該当ページを読んでいると、そこにあったのは 3値論理(three-valued logic) の説明。
TRUE / FALSE / UNKNOWN
「UNKNOWN?」 —— 私の脳内はダチョウ倶楽部ばりのリアクションで、思わず声が出ました:「聞いてないよ〜!」。
ポイントはここです。NULLが混ざっていると、比較式は TRUE でも FALSE でもなく UNKNOWN を返す。つまり、条件に合わない(=FALSE)と判断されるわけではなく、「わからないから除外しますね」という挙動になります。私の直感(NULLはただの空欄でFALSEに等しい)は間違っていたのです。
4. 解決:NULLを明示的に扱う
理解した私はクエリを修正しました。NULLを明示的に考慮することで、期待する結果が得られます:
SELECT * FROM products
WHERE product_name NOT LIKE '%限定%'
OR product_name IS NULL;
この一行を追加した瞬間、期待したデータがちゃんと返ってきたときの爽快感と言ったら!同時に「3時間、どこいった……」という脱力も襲ってきましたが、学びは確かでした。
5. NULLでハマる理由(初心者向けに簡単に説明)
なぜNULLは嫌われがちなのかを簡単に整理します:
- 見た目は空欄でも、SQL的には「値が不明」:NULL は「0」でも「”(空文字)」でもありません。
- 比較は UNKNOWN を返す:たとえば
product_name NOT LIKE '%限定%'
が NULL を含む行に対しては TRUE/FALSE ではなく UNKNOWN になります。 - WHERE句でUNKNOWNは排除される:WHERE は TRUE の行だけ残すため、NULLの行が落ちる/思わぬ挙動になることがあります。
この理解があると、データ抽出でのトラブルシュートが格段に早くなります。
6. 反省と学び:3時間は無駄だったのか?
冷静になると、今回の3時間は完全な無駄ではありませんでした。むしろ「痛い学び」の価値は大きかったと思います:
- NULLと3値論理の挙動が身に染みて理解できた
- 似たような失敗を繰り返す確率がぐっと下がる
- SQLの奥深さ(そして面白さ)を体感できた
要するに、最初はツラいけれど、きちんと理屈が分かるとSQLってパズルみたいで面白いんだと気づきました。
7. 初心者が次に気をつけること
- 疑ったらまずNULLをチェックする:
SELECT COUNT(*) FROM products WHERE product_name IS NULL;
のようにNULLの存在を確認。 - 条件式を書いたらNULLの扱いを明示する:
IS NULL
やCOALESCE
を活用。 - 小さなサンプルデータで試す: 問題が起きたらテスト用の少数行で再現して原因追及。
- 参考書はたまに読むだけでなく実例で検証する: 理屈を見てから手で動かすと理解が早いです。
まとめ:NULLに出会ったら、逃げずに向き合おう
SQL初心者の私がNULLにハマり、3時間あれやこれや試行錯誤した結論はシンプルです。NULLはただの空欄ではなく、SQLの論理に深く影響する存在だということ。
最初は悩むこともあるかもしれませんが、理解してしまえばその後の安心感は格別。皆さんもNOT LIKEが期待どおり動かないときは、まずNULLを疑ってくださいね。