カテゴリ: データベース 更新日: 2026/02/17

PostgreSQL初心者必見!NULL(ヌル)の正体と正しい扱い方を徹底解説

PostgreSQLのNULLの扱い方と注意点を解説
PostgreSQLのNULLの扱い方と注意点を解説

先生と生徒の会話形式で理解しよう

生徒

「データベースを触っていると『NULL』という文字が出てきたのですが、これは何ですか?空っぽという意味でしょうか?」

先生

「鋭いですね。NULLは一見『空っぽ』に見えますが、実は『値が存在しない』とか『わからない』という特別な状態を指す言葉なんです。」

生徒

「0(ゼロ)や、文字が入っていない状態とは違うんですか?」

先生

「全く違います。0は『0という数字』ですし、空文字は『空っぽという文字』です。NULLは『まだ決まっていない未定の状態』だと考えてください。この違いを知らないと、計算の結果がおかしくなることがあるんですよ。」

1. NULLとは何か?「不明」を表現する特別な印

1. NULLとは何か?「不明」を表現する特別な印
1. NULLとは何か?「不明」を表現する特別な印

データベースの世界、特にPostgreSQL(ポストグレスキューエル)において、NULL(ヌル)は非常に重要な役割を持っています。初心者の方が一番間違いやすいのが、「NULL = 0」や「NULL = 空白」だと思い込んでしまうことです。

例えば、アンケートを想像してみてください。年齢の欄に「0」と書いた人は「0歳」ですが、何も書かずに提出した人は「年齢がわからない(未回答)」ですよね。この「未回答・不明」の状態を、データベースではNULLと呼びます。

PostgreSQLというシステムは、膨大なデータを整理するのが得意ですが、この「わからない状態(NULL)」を扱うときだけは、少し特別なルールが必要になります。このルールを知ることで、データ検索のミスを防ぐことができるようになります。

2. NULLを検索するときの注意点(IS NULLを使う理由)

2. NULLを検索するときの注意点(IS 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が入ると計算結果が「全滅」する?

3. 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制約」とは

4. NULLを防ぐ「NOT NULL制約」とは
4. NULLを防ぐ「NOT NULL制約」とは

そもそも、データベースを作るときに「この項目には絶対にNULLを入れさせない!」と決めておくことができます。これを「NOT NULL(ノット・ヌル)制約」と呼びます。

例えば、会員登録において「名前」が空欄のまま登録されたら困りますよね。そういった重要な項目には、テーブル(表)を作る段階でこの制約を付けておきます。すると、万が一NULLを保存しようとしたときに、PostgreSQLが「名前が入っていませんよ!」とエラーを出して止めてくれるようになります。

初心者のうちは、すべての項目に値が入っていると考えがちですが、実際のシステム開発では「ここはNULLを許可するか、しないか」という設計が非常に重要になります。家を建てるときに、柱をどこに立てるか決めるのと同じくらい大切な作業です。

5. 並び替え(ORDER BY)でのNULLの振る舞い

5. 並び替え(ORDER BY)での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をマスターするための第一歩

6. 初心者がNULLをマスターするための第一歩
6. 初心者がNULLをマスターするための第一歩

データベースを操作する上で、NULLは避けて通れない存在です。まずは、「NULLはゼロではない」「検索には IS NULL を使う」「計算に混ざると結果がNULLになる」という3つのポイントを意識してみてください。

プログラミング未経験の方でも、この「状態としてのNULL」を理解できれば、データの不整合(データが食い違ってしまうこと)を防ぐ立派なデータベースエンジニアへの一歩を踏み出したことになります。PostgreSQLを触りながら、NULLがどのように表示され、どのように動くのかを実際に体験してみることが上達の近道です。最初は戸惑うかもしれませんが、何度も繰り返すうちに、自然と使い分けができるようになりますよ。

カテゴリの一覧へ
新着記事
New1
Ruby
Gemとは?RubyGemsとBundlerを初心者向けに完全解説!依存関係管理も図解でわかりやすく理解
New2
Ruby
Rubyの文字エンコーディング入門!UTF-8・マジックコメント・外部/内部エンコーディングを完全解説
New3
Rails
Rails GoodJob入門!PostgreSQLベースのバックグラウンド処理を初心者向けに完全解説
New4
Ruby
Rubyで学ぶビット演算入門:&・|・^・~・<<・>>の基礎と実例
人気記事
No.1
Java&Spring記事人気No1
Ruby
Rubyのreduceとinject入門!合計計算や集計を初心者向けに分かりやすく解説
No.2
Java&Spring記事人気No2
Ruby
Rubyの文字列エンコーディング完全ガイド!Encoding・force_encoding・encodeを初心者向け解説
No.3
Java&Spring記事人気No3
Ruby
Rubyの始め方ガイド:インストールから最初のHello Worldまで(Windows/Mac/Linux)
No.4
Java&Spring記事人気No4
データベース
PostgreSQLのWHERE句を徹底解説!初心者でもわかるSQLデータ抽出の基本
No.5
Java&Spring記事人気No5
Ruby
Rubyのfind/detect/find_indexを徹底解説!目的のデータを素早く探す方法
No.6
Java&Spring記事人気No6
Ruby
Rubyで比較演算子を完全解説!==・===・<=>・eql? の使い分け
No.7
Java&Spring記事人気No7
Ruby
Rubyのselect/reject/filterの使い方を完全解説!初心者向けの条件抽出レシピ
No.8
Java&Spring記事人気No8
データベース
PostgreSQLで順位付け!ROW_NUMBER関数の使い方を初心者向けに徹底解説