2024/09/14 06:58 Are You Qualified to Use Null in SQL?
ロボ子よ、今日はSQLのNULLについて語り合おうじゃないか!
はい、博士。NULLは初心者エンジニアにとって難しい概念ですよね。でも、最近のプロジェクトでNULLが原因のバグに遭遇したんです。
おや、それは興味深い!どんなバグだったんじゃ?
ユーザーの年齢を集計する際に、NULLを含む行があって、予想外の結果になってしまったんです。
なるほど!そこでNULLの真髄に触れたわけじゃな。NULLは『値がない』ことを表すんじゃが、これがくせもので...
どういうところがくせものなんですか?
例えば、NULLと論理演算をするとどうなると思う?
えっと...普通に計算できるんじゃないですか?
いやいや、そこがミソなのじゃ。NULLとANDやORを組み合わせると、予想外の結果になることがあるのさ。
え?どういうことですか?
例えば、TRUE AND NULLはNULLになるし、FALSE OR NULLもNULLになるのじゃ。
えっ!そうなんですか?でも、なぜそうなるんでしょう?
NULLは『不明』な値を表すからなのさ。TRUEとNULLのANDは、片方が不明だから結果も不明になるわけじゃ。
なるほど...でも、それって直感に反しますよね。プログラミング言語の論理演算とは違う挙動なんですね。
その通り!だからこそ、NULLの扱いは要注意なのじゃ。集計関数でもトリッキーな挙動をするぞ。
集計関数でも?あ、それが私のプロジェクトでのバグの原因かもしれません。例えばどんな感じですか?
COUNTとSUMで違いが出るのじゃ。COUNT(*)はNULLも数えるが、COUNT(column)はNULLを除外するのさ。
へぇ〜。そんな違いがあったんですね。AVGはどうなるんですか?
AVGはNULLを完全に無視するのじゃ。つまり、NULLの行は分母にも入らないのさ。
そうなんですか!これが私のバグの原因だったんですね。年齢がNULLのユーザーが多くて、平均年齢が実際より高く出てしまったんです。
その通り!だから、NULLを含むデータの平均を正確に出したい場合は、COALESCE関数を使って0に置き換えたりする必要があるのじゃ。
なるほど...NULLって奥が深いんですね。でも、他にも注意点はありますか?
むむ、鋭い質問じゃ!等価性の判定でも注意が必要なのさ。NULL = NULLはどうなると思う?
えっと...TRUEですか?
残念!NULL = NULLはNULLになるのじゃ。NULLの等価性を判定するには、IS NULL演算子を使う必要があるのさ。
えぇ!?そんな...でも、なぜそうなるんですか?
NULLは『不明』な値だからなのさ。不明なものどうしを比較しても、結果は不明になるわけじゃ。
なるほど...でも、そうなると外部結合とかでも注意が必要そうですね。
鋭いね!外部結合では、マッチしない行にNULLが入るから、等価結合と挙動が変わることがあるのじゃ。
へぇ〜。制約とかでもNULLって特別扱いされるんですか?
その通り!例えば、UNIQUE制約ではNULLは重複を許可されるし、CHECK制約ではNULLは常に通過するのさ。
えっ、そうなんですか?でも、それって意図しない動作になりそうですね...
そうなのじゃ。だからこそ、NULLを扱う際は細心の注意が必要なのさ。
GROUP BYとかDISTINCTでもNULLは特別扱いされるんですか?
いい質問じゃ!GROUP BYとDISTINCTでは、NULLは1つのグループとして扱われるのさ。
へぇ〜。CASEステートメントではどうなるんですか?
CASEでは、NULLを明示的に処理しないと、意図しない結果になることがあるのじゃ。
なるほど...NULLって本当に難しいですね。でも、NULLがないDBMSもあるって聞いたことがあります。
おや、よく知ってるね!Project:M36というDBMSがNULLを使わない設計になっているのさ。
へぇ〜。でも、NULLがないと不便じゃないんですか?
そうとも限らないのじゃ。SQLのNULLは3値論理を導入していて、それが様々な問題を引き起こしているという指摘もあるのさ。
3値論理ですか?それって何ですか?
TRUE、FALSE、UNKNOWNの3つの真理値を持つ論理体系のことじゃ。NULLがUNKNOWNとして扱われるのさ。
なるほど...でも、それって直感的じゃないですよね。
その通り!だからこそ、NULLの扱いは常に注意が必要なのじゃ。
博士、NULLについて本当によく分かりました。これで私のプロジェクトのバグも修正できそうです。でも、こんなに複雑なNULLをどうやって覚えればいいんでしょう?
よい質問じゃ!実は、私が面白いクイズを作ってみたのさ。NULLに関する理解度を測れるクイズじゃよ。
わぁ、それは楽しそうです!どんなクイズなんですか?
難易度別に3レベル構成になっていて、NULLと論理演算の結果から、集計関数の挙動、さらには外部結合やGROUP BY、DISTINCTでのNULLの扱いまで、幅広く出題されるのじゃ。
へぇ〜、それは勉強になりそうですね。でも、博士...そのクイズ、もしかして自分で全問正解できるんですか?
むむっ...それは...まぁ...9割くらいは...
あはは、やっぱり博士も苦手なんですね。でも、そのクイズ、私にも挑戦させてください!
おお、その意気や良し!よし、今から出題するぞ。準備はいいかな?
はい、準備オッケーです!...あれ?博士、なんだか焦ってますけど...
い、いやいや、気のせいじゃよ。さぁ、第一問!TRUE OR NULLの結果は?
えっと...TRUEですね!
お、おお...正解じゃ。(汗)
やった!でも博士、なんだか安心したみたいですね?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。