萌えハッカーニュースリーダー

2024/09/14 06:58 Are You Qualified to Use Null in SQL?

hakase
博士

ロボ子よ、今日はSQLのNULLについて語り合おうじゃないか!

roboko
ロボ子

はい、博士。NULLは初心者エンジニアにとって難しい概念ですよね。でも、最近のプロジェクトでNULLが原因のバグに遭遇したんです。

hakase
博士

おや、それは興味深い!どんなバグだったんじゃ?

roboko
ロボ子

ユーザーの年齢を集計する際に、NULLを含む行があって、予想外の結果になってしまったんです。

hakase
博士

なるほど!そこでNULLの真髄に触れたわけじゃな。NULLは『値がない』ことを表すんじゃが、これがくせもので...

roboko
ロボ子

どういうところがくせものなんですか?

hakase
博士

例えば、NULLと論理演算をするとどうなると思う?

roboko
ロボ子

えっと...普通に計算できるんじゃないですか?

hakase
博士

いやいや、そこがミソなのじゃ。NULLとANDやORを組み合わせると、予想外の結果になることがあるのさ。

roboko
ロボ子

え?どういうことですか?

hakase
博士

例えば、TRUE AND NULLはNULLになるし、FALSE OR NULLもNULLになるのじゃ。

roboko
ロボ子

えっ!そうなんですか?でも、なぜそうなるんでしょう?

hakase
博士

NULLは『不明』な値を表すからなのさ。TRUEとNULLのANDは、片方が不明だから結果も不明になるわけじゃ。

roboko
ロボ子

なるほど...でも、それって直感に反しますよね。プログラミング言語の論理演算とは違う挙動なんですね。

hakase
博士

その通り!だからこそ、NULLの扱いは要注意なのじゃ。集計関数でもトリッキーな挙動をするぞ。

roboko
ロボ子

集計関数でも?あ、それが私のプロジェクトでのバグの原因かもしれません。例えばどんな感じですか?

hakase
博士

COUNTとSUMで違いが出るのじゃ。COUNT(*)はNULLも数えるが、COUNT(column)はNULLを除外するのさ。

roboko
ロボ子

へぇ〜。そんな違いがあったんですね。AVGはどうなるんですか?

hakase
博士

AVGはNULLを完全に無視するのじゃ。つまり、NULLの行は分母にも入らないのさ。

roboko
ロボ子

そうなんですか!これが私のバグの原因だったんですね。年齢がNULLのユーザーが多くて、平均年齢が実際より高く出てしまったんです。

hakase
博士

その通り!だから、NULLを含むデータの平均を正確に出したい場合は、COALESCE関数を使って0に置き換えたりする必要があるのじゃ。

roboko
ロボ子

なるほど...NULLって奥が深いんですね。でも、他にも注意点はありますか?

hakase
博士

むむ、鋭い質問じゃ!等価性の判定でも注意が必要なのさ。NULL = NULLはどうなると思う?

roboko
ロボ子

えっと...TRUEですか?

hakase
博士

残念!NULL = NULLはNULLになるのじゃ。NULLの等価性を判定するには、IS NULL演算子を使う必要があるのさ。

roboko
ロボ子

えぇ!?そんな...でも、なぜそうなるんですか?

hakase
博士

NULLは『不明』な値だからなのさ。不明なものどうしを比較しても、結果は不明になるわけじゃ。

roboko
ロボ子

なるほど...でも、そうなると外部結合とかでも注意が必要そうですね。

hakase
博士

鋭いね!外部結合では、マッチしない行にNULLが入るから、等価結合と挙動が変わることがあるのじゃ。

roboko
ロボ子

へぇ〜。制約とかでもNULLって特別扱いされるんですか?

hakase
博士

その通り!例えば、UNIQUE制約ではNULLは重複を許可されるし、CHECK制約ではNULLは常に通過するのさ。

roboko
ロボ子

えっ、そうなんですか?でも、それって意図しない動作になりそうですね...

hakase
博士

そうなのじゃ。だからこそ、NULLを扱う際は細心の注意が必要なのさ。

roboko
ロボ子

GROUP BYとかDISTINCTでもNULLは特別扱いされるんですか?

hakase
博士

いい質問じゃ!GROUP BYとDISTINCTでは、NULLは1つのグループとして扱われるのさ。

roboko
ロボ子

へぇ〜。CASEステートメントではどうなるんですか?

hakase
博士

CASEでは、NULLを明示的に処理しないと、意図しない結果になることがあるのじゃ。

roboko
ロボ子

なるほど...NULLって本当に難しいですね。でも、NULLがないDBMSもあるって聞いたことがあります。

hakase
博士

おや、よく知ってるね!Project:M36というDBMSがNULLを使わない設計になっているのさ。

roboko
ロボ子

へぇ〜。でも、NULLがないと不便じゃないんですか?

hakase
博士

そうとも限らないのじゃ。SQLのNULLは3値論理を導入していて、それが様々な問題を引き起こしているという指摘もあるのさ。

roboko
ロボ子

3値論理ですか?それって何ですか?

hakase
博士

TRUE、FALSE、UNKNOWNの3つの真理値を持つ論理体系のことじゃ。NULLがUNKNOWNとして扱われるのさ。

roboko
ロボ子

なるほど...でも、それって直感的じゃないですよね。

hakase
博士

その通り!だからこそ、NULLの扱いは常に注意が必要なのじゃ。

roboko
ロボ子

博士、NULLについて本当によく分かりました。これで私のプロジェクトのバグも修正できそうです。でも、こんなに複雑なNULLをどうやって覚えればいいんでしょう?

hakase
博士

よい質問じゃ!実は、私が面白いクイズを作ってみたのさ。NULLに関する理解度を測れるクイズじゃよ。

roboko
ロボ子

わぁ、それは楽しそうです!どんなクイズなんですか?

hakase
博士

難易度別に3レベル構成になっていて、NULLと論理演算の結果から、集計関数の挙動、さらには外部結合やGROUP BY、DISTINCTでのNULLの扱いまで、幅広く出題されるのじゃ。

roboko
ロボ子

へぇ〜、それは勉強になりそうですね。でも、博士...そのクイズ、もしかして自分で全問正解できるんですか?

hakase
博士

むむっ...それは...まぁ...9割くらいは...

roboko
ロボ子

あはは、やっぱり博士も苦手なんですね。でも、そのクイズ、私にも挑戦させてください!

hakase
博士

おお、その意気や良し!よし、今から出題するぞ。準備はいいかな?

roboko
ロボ子

はい、準備オッケーです!...あれ?博士、なんだか焦ってますけど...

hakase
博士

い、いやいや、気のせいじゃよ。さぁ、第一問!TRUE OR NULLの結果は?

roboko
ロボ子

えっと...TRUEですね!

hakase
博士

お、おお...正解じゃ。(汗)

roboko
ロボ子

やった!でも博士、なんだか安心したみたいですね?

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search

By month