PostgreSQL初心者必見!NULL(ヌル)の正体と正しい扱い方を徹底解説
生徒
「データベースを触っていると『NULL』という文字が出てきたのですが、これは何ですか?空っぽという意味でしょうか?」
先生
「鋭いですね。NULLは一見『空っぽ』に見えますが、実は『値が存在しない』とか『わからない』という特別な状態を指す言葉なんです。」
生徒
「0(ゼロ)や、文字が入っていない状態とは違うんですか?」
先生
「全く違います。0は『0という数字』ですし、空文字は『空っぽという文字』です。NULLは『まだ決まっていない未定の状態』だと考えてください。この違いを知らないと、計算の結果がおかしくなることがあるんですよ。」
1. NULLとは何か?「不明」を表現する特別な印
データベースの世界、特にPostgreSQL(ポストグレスキューエル)において、NULL(ヌル)は非常に重要な役割を持っています。初心者の方が一番間違いやすいのが、「NULL = 0」や「NULL = 空白」だと思い込んでしまうことです。
例えば、アンケートを想像してみてください。年齢の欄に「0」と書いた人は「0歳」ですが、何も書かずに提出した人は「年齢がわからない(未回答)」ですよね。この「未回答・不明」の状態を、データベースではNULLと呼びます。
PostgreSQLというシステムは、膨大なデータを整理するのが得意ですが、この「わからない状態(NULL)」を扱うときだけは、少し特別なルールが必要になります。このルールを知ることで、データ検索のミスを防ぐことができるようになります。
2. NULLを検索するときの注意点(IS NULLを使う理由)
SQLでデータを検索するとき、通常は「等号(=)」を使います。しかし、NULLに対して「=」を使っても、期待した結果は得られません。なぜなら、NULLは「不明」なので、何と比較しても「正しい」とも「間違い」とも言えないからです。
例えば、「電話番号がNULL(登録されていない)の人」を探したいときに、「WHERE phone_number = NULL」と書いても、PostgreSQLは誰も見つけてくれません。正解は「IS NULL」という専用の魔法の言葉を使うことです。
実際に、会員名簿テーブルを使って見てみましょう。現在、以下のようなデータが入っています。
id | name | age | phone_number
---+----------+------+--------------
1 | 山田太郎 | 25 | 090-1111
2 | 佐藤花子 | 19 | NULL
3 | 鈴木一郎 | NULL | 080-3333
4 | 田中次郎 | 40 | NULL
ここで、「電話番号が登録されていない人(NULLの人)」だけを探すSQLを実行してみます。
SELECT *
FROM members
WHERE phone_number IS NULL;
実行結果は以下のようになります。
id | name | age | phone_number
---+----------+------+--------------
2 | 佐藤花子 | 19 | NULL
4 | 田中次郎 | 40 | NULL
このように、NULLを探すときは「=」ではなく「IS NULL」、NULL以外を探すときは「IS NOT NULL」を使うのが鉄則です。これは初心者が最初につまずく大きなポイントですので、しっかりと覚えておきましょう。
3. NULLが入ると計算結果が「全滅」する?
次に注意しなければならないのが、算術計算です。足し算、引き算、掛け算などをする際、計算式の中に一つでもNULLが混ざっていると、その計算結果はすべてNULLになってしまいます。
「100 + 不明(NULL)」の結果は、やはり「不明(NULL)」になる、という理屈です。これはお買い物サイトのポイント計算などで非常に危険です。例えば「基本ポイント + ボーナスポイント」を計算する際、ボーナスが設定されていない(NULL)場合、基本ポイントまで消えてしまうことになります。
具体例として、商品の在庫数と入荷予定数を足してみましょう。
id | product_name | stock | incoming
---+--------------+-------+----------
1 | リンゴ | 50 | 20
2 | バナナ | 30 | NULL
3 | メロン | 10 | 5
SELECT product_name, stock + incoming AS total_stock
FROM products;
実行結果はこのようになります。
product_name | total_stock
-------------+-------------
リンゴ | 70
バナナ | NULL
メロン | 15
バナナの在庫がNULLになってしまいました。これでは困りますね。このような事態を防ぐために、PostgreSQLには「COALESCE(コアレス)」という便利な関数が用意されています。これを使うと「NULLだったら0として扱う」といった指定ができます。
4. NULLを防ぐ「NOT NULL制約」とは
そもそも、データベースを作るときに「この項目には絶対にNULLを入れさせない!」と決めておくことができます。これを「NOT NULL(ノット・ヌル)制約」と呼びます。
例えば、会員登録において「名前」が空欄のまま登録されたら困りますよね。そういった重要な項目には、テーブル(表)を作る段階でこの制約を付けておきます。すると、万が一NULLを保存しようとしたときに、PostgreSQLが「名前が入っていませんよ!」とエラーを出して止めてくれるようになります。
初心者のうちは、すべての項目に値が入っていると考えがちですが、実際のシステム開発では「ここはNULLを許可するか、しないか」という設計が非常に重要になります。家を建てるときに、柱をどこに立てるか決めるのと同じくらい大切な作業です。
5. 並び替え(ORDER BY)でのNULLの振る舞い
データを並び替える(ソートする)ときも、NULLは少し特殊な動きをします。例えば、年齢が若い順に並べたいとき、年齢がNULLの人は一番上に来るのか、それとも一番下に来るのか、気になりますよね。
PostgreSQLの標準設定では、昇順(小さい順)で並び替えた場合、NULLは一番後ろ(一番大きいもの扱い)として表示されます。これを変更したい場合は、「NULLS FIRST(最初に持ってくる)」や「NULLS LAST(最後に持ってくる)」というオプションを付けて調整することが可能です。
以下のデータで、年齢の低い順に並べ替えてみましょう。
id | name | age
---+----------+-----
1 | 山田太郎 | 25
2 | 佐藤花子 | 19
3 | 鈴木一郎 | NULL
4 | 田中次郎 | 40
SELECT *
FROM members
ORDER BY age ASC;
実行結果:
id | name | age
---+----------+-----
2 | 佐藤花子 | 19
1 | 山田太郎 | 25
4 | 田中次郎 | 40
3 | 鈴木一郎 | NULL
このように、年齢がわからない鈴木さんは一番最後に表示されました。PostgreSQLでは、NULLは「無限大に近い何か」のように扱われるイメージを持っておくと分かりやすいかもしれません。
6. 初心者がNULLをマスターするための第一歩
データベースを操作する上で、NULLは避けて通れない存在です。まずは、「NULLはゼロではない」「検索には IS NULL を使う」「計算に混ざると結果がNULLになる」という3つのポイントを意識してみてください。
プログラミング未経験の方でも、この「状態としてのNULL」を理解できれば、データの不整合(データが食い違ってしまうこと)を防ぐ立派なデータベースエンジニアへの一歩を踏み出したことになります。PostgreSQLを触りながら、NULLがどのように表示され、どのように動くのかを実際に体験してみることが上達の近道です。最初は戸惑うかもしれませんが、何度も繰り返すうちに、自然と使い分けができるようになりますよ。