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によるコンテンツを含み、ハルシネーションの可能性があります。