【入門編】 NULL値の扱い – Cloud Spanner

やあ。Cloud Spannerの世界へようこそ。
世界中のデータを一瞬で、しかも矛盾なく扱うための「魔法のようなデータベース」、それがCloud Spannerだ。

今日は、多くのエンジニアが意外と深追いしない、けれど「ここを押さえればプロの入り口」と言える「NULL(ヌル)の扱い」について話をしよう。

堅苦しい定義は一旦置いて、まずは日常の風景から考えてみるよ。

—

NULLとは、「空っぽ」の箱ではない

君がアンケート用紙を配ったとするね。
そこに「趣味」を書く欄があったとして、ある人は「読書」と書いた。ある人は何も書かずに提出した。

データベースの世界で、この「何も書かれていない」状態を表現するのが`NULL`だ。
でも、ここで一つだけ絶対に勘違いしてはいけないことがある。

NULLは「0」でも「空白(空文字)」でもない。

  • 0: 「数字の0」という値が入っている。
  • 空白(””): 「何も書かれていない文字」という値が入っている。
  • NULL: 「値が存在しないこと」そのものを指す、特別な状態。

Cloud Spannerにおいて、NULLは「箱の中身が空っぽなんじゃなくて、箱そのものがまだ用意されていない(あるいは価値が不明である)」という状態なんだ。

—

Cloud SpannerでNULLと付き合うときの「3つの鉄則」

Spannerを使いこなす上で、NULLとの付き合い方にはいくつかの「暗黙のルール」がある。これを覚えるだけで、クエリの不具合を大幅に減らせるよ。

1. 「NULL = NULL」は成立しない

これが一番の罠だ。プログラムで「AとBは同じか?」と聞くとき、もしAとBの両方がNULLだったら、「はい、同じです」と言ってほしいよね?
でも、データベースの世界では「NULLは比較できない」というルールがある。

  • `NULL == NULL` は「真(True)」にならない。
  • 「値が不明なもの」同士を比べても、「等しいかどうかすら分からない」からだ。

だから、もし値がNULLかどうかを調べたいときは、`==` を使わず、必ず `IS NULL` という専用の言葉を使ってあげよう。

— × ダメな例:NULLとは比較できない
SELECT FROM Users WHERE nickname = NULL;

— 〇 正しい例:NULLであるかどうかを尋ねる
SELECT FROM Users WHERE nickname IS NULL;

2. インデックス作成時の「影の功労者」

Spannerは、データを素早く探すために「インデックス(索引)」を作る。
ここで初心者が驚くのが、「NULL値もインデックスに含まれる」ということだ。

「値がないのにインデックスに載るの?」と思うかもしれないけれど、SpannerはNULLを「一番小さな値」として扱うことで、整列させてインデックスに組み込むんだ。これにより、`WHERE nickname IS NULL` といったクエリも爆速で処理できる。

ただし、「NOT NULL制約」を忘れてはいけない。
絶対にデータが入るべき場所(例えばユーザーIDなど)には、必ず `NOT NULL` を設定しよう。これにより、システムが「値が入っていない」というミスを防いでくれる。これが堅牢な設計の第一歩だ。

3. 計算に混ぜると、結果がNULLになる

これを知らないと、集計で泣きを見ることになるよ。
「NULL + 100」の結果は何だと思う?

答えは「101」ではなく、「NULL」だ。

値が分からないものに100を足しても、結局「分からない(NULL)」ままなんだ。もしNULLを「0」として扱いたいなら、`COALESCE`(コアレス)という関数を使って、安全に変換してあげるのが大人の作法だ。

— NULLを0に置き換えてから計算する魔法の関数
SELECT COALESCE(score, 0) + 100 FROM Games;

—

まとめ:ここをクリアすれば、君はもう初心者じゃない

Cloud SpannerにおいてNULLは、単なる「空データ」ではなく、「まだ値が決まっていないという重要な状態」なんだ。

1. 比較するときは `IS NULL` を使う(`==` は禁句!)
2. 大事な項目には `NOT NULL` をつける(データの品質を守る!)
3. 計算するときは `COALESCE` で守る(NULLの伝染を防ぐ!)

この3つさえ意識していれば、君が書くクエリは驚くほど安定するはずだ。

技術は難しそうに見えて、実はこうやって「日常の整理整頓」と似ている。Cloud Spannerは、この整理整頓を極めて高いレベルでサポートしてくれる最高のパートナーだ。

さあ、恐れずにNULLを扱って、君だけの最強のデータベースを構築してくれ。応援しているよ!

コメント

タイトルとURLをコピーしました