データベース基本概念

NULL ぬる

値なし未定義データベースSQL三値論理IS NULL
NULLについて教えて

簡単に言うとこんな感じ!

NULLは「値がない」を表す特別な記号だよ。0でも空白でもなくて、「そもそも何も入ってない・わからない」っていう状態なんだ。アンケートで「未回答」の欄みたいなイメージ!データベースを扱うときに超重要な概念だよ。


NULLとは

NULL(ヌル) とは、データベースや多くのプログラミング言語において「値が存在しない・不明である」状態を表す特殊な概念です。これは「0(ゼロ)」でも「空文字("")」でもなく、「そもそもデータが存在しない」ことを示す独立した概念として扱われます。

たとえば、社員テーブルに「携帯電話番号」の列があったとして、携帯を持っていない社員のセルには何を入れるべきでしょうか。0を入れると「電話番号が0」という誤った情報になり、空文字を入れると「空っぽの文字列」という別の意味になります。NULLを使うことで「電話番号が不明または存在しない」という正確な情報を表現できます。

NULLはデータの品質・整合性に大きく関わる概念であり、SQL(Structured Query Language:データベース操作言語) の仕様として標準化されています。扱いを誤るとデータ集計や検索が意図せず壊れる原因になるため、システム発注・設計の場面でも無視できない重要なポイントです。


NULLの核心:三値論理(True / False / Unknown)

通常の論理は「True(真)」か「False(偽)」の二択ですが、NULLが絡むと 「Unknown(不明)」 が加わった三値論理になります。これがNULLを難しくしている根本原因です。

比較式結果理由
NULL = NULLUnknown(不明)「不明」同士を比べても判断できない
NULL = 1Unknown(不明)「不明」が1かどうかわからない
NULL IS NULLTrue(真)「NULLかどうか」の専用構文はTrue
NULL IS NOT NULLFalse(偽)NULLはNOT NULLではない
NULL + 1NULLNULLを含む計算結果はすべてNULL

⚠️ よくある罠: WHERE 電話番号 = NULL という条件は常に「Unknown」を返すため、NULLの行がヒットしません。正しくは WHERE 電話番号 IS NULL と書く必要があります。

覚え方:「NULLは伝染する」

NULLが絡む演算は結果もNULLになる、という性質を「NULLの伝染」と呼ぶことがあります。NULL + 何でも = NULLNULL OR NULL = NULL など、NULLに触れると結果が「不明」に染まるイメージで覚えておくとミスが減ります。

NULL許容 vs. NOT NULL制約

設定意味向いているケース
NULL許容(デフォルト)その列にNULLを入れてよい任意入力の項目(電話番号・備考欄など)
NOT NULL制約NULLを禁止。必ず値が必要必須項目(氏名・社員番号・作成日など)

システム設計時に各項目をNULL許容にするかどうかを決めることは、データ品質の設計 そのものです。安易に「とりあえずNULL許容」にしておくと、後で集計・結合がおかしくなるトラブルが起きやすいため注意が必要です。


歴史と背景

  • 1970年 — エドガー・コッド博士がリレーショナルデータベースの理論を発表。この時点でNULLに相当する「不明値」の概念が理論的に提唱された
  • 1979年 — Oracle(世界初の商用リレーショナルデータベース)がリリース。NULLの実装が商用製品に登場する
  • 1986年 — ANSI/ISOがSQL-86として初のSQL標準を制定。NULLと三値論理が正式に標準化される
  • 1992年SQL-92で機能が拡張。COALESCE(コアレス:NULLを別の値に置き換える関数)なども標準化
  • 現在 — すべての主要データベース(MySQL・PostgreSQL・Oracle・SQL Serverなど)がNULLをサポート。ただし挙動に細かい差異があることもある

コッド博士自身は後年、NULLの仕様が複雑になりすぎたことへの懸念を示し、より明確な「不明値」と「該当なし」を分けた設計を提案しましたが、現実のシステムでは標準のNULLが広く使われ続けています。


NULLに関連するSQL操作と比較

NULLを安全に扱うために、SQLにはいくつかの専用の関数・構文が用意されています。

-- NULLを検索する(= は使えない!)
SELECT * FROM 社員 WHERE 電話番号 IS NULL;

-- NULL以外を検索する
SELECT * FROM 社員 WHERE 電話番号 IS NOT NULL;

-- NULLを別の値に置き換える(COALESCE:最初のNULLでない値を返す)
SELECT 氏名, COALESCE(電話番号, '未登録') AS 電話番号 FROM 社員;

-- ISNULL / NVL(データベース製品による方言)
SELECT ISNULL(電話番号, '未登録') FROM 社員;  -- SQL Server
SELECT NVL(電話番号, '未登録') FROM 社員;     -- Oracle

-- COUNT関数とNULLの関係
SELECT COUNT(*)        FROM 社員;  -- NULLを含む全行数
SELECT COUNT(電話番号) FROM 社員;  -- NULLを除いた行数 ← 結果が変わる!

NULL・0・空文字の比較図

NULL・0・空文字の違い 項目 NULL 0(ゼロ) 空文字 "" 意味 値が存在しない 数値のゼロ 長さ0の文字列 データ型 型なし(特殊) 数値型 文字列型 比較方法 IS NULL = 0 = '' 具体例 未回答・不明 残高ゼロ円 名前欄を空送信 ※ NULLは「知らない」、0は「確かにゼロ」、空文字は「確かに何もない文字列」

関連する規格・RFC

規格内容
ISO/IEC 9075(SQL標準)SQLの国際標準規格。SQL-86・SQL-92・SQL:2016など複数版があり、NULLと三値論理はSQL-86から規定されている

関連用語

  • SQL — データベースを操作するための標準的な問い合わせ言語
  • リレーショナルデータベース — 表形式でデータを管理するデータベースの種類。NULLはここで生まれた概念
  • 主キー — テーブルの行を一意に識別する列。原則としてNULLを許容しない
  • NOT NULL制約 — 特定の列にNULLを入れることを禁止するデータベースの制約
  • データ型 — 数値・文字列・日付など、データの種類を定義する概念
  • インデックス — 検索を高速化する仕組み。NULLの扱いが製品によって異なる
  • COALESCE関数 — NULLを別の値に置き換えるSQL標準関数