プログラミング入門

【実体験】SQL初心者がNULLにはまる|3値論理に振り回された3時間

 

「NOT LIKEで除外してるはずなのに、なぜか期待したデータが出てこない…?」
商品データ相手にのめり込み、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 NULLCOALESCE を活用。
  • 小さなサンプルデータで試す: 問題が起きたらテスト用の少数行で再現して原因追及。
  • 参考書はたまに読むだけでなく実例で検証する: 理屈を見てから手で動かすと理解が早いです。

まとめ:NULLに出会ったら、逃げずに向き合おう

SQL初心者の私がNULLにハマり、3時間あれやこれや試行錯誤した結論はシンプルです。NULLはただの空欄ではなく、SQLの論理に深く影響する存在だということ。

最初は悩むこともあるかもしれませんが、理解してしまえばその後の安心感は格別。皆さんもNOT LIKEが期待どおり動かないときは、まずNULLを疑ってくださいね。

 

ABOUT ME
ショート
文系出身・一般&医療事務歴ありの会社員。 「パソコン苦手…」「残業が当たり前…」そんな日々を変えたくて、40代から独学でPythonやExcelの自動化に挑戦中。 プログラミングもブログも初心者レベルからの出発ですが、“早く帰りたい”一心で効率化を追求しています。 つまずいたリアルな失敗談や、「これならできた!」という事例を通して、パソコンに自信がない人の味方になれるブログを目指しています。