NULL ぬる
簡単に言うとこんな感じ!
NULLは「値がない」を表す特別な記号だよ。0でも空白でもなくて、「そもそも何も入ってない・わからない」っていう状態なんだ。アンケートで「未回答」の欄みたいなイメージ!データベースを扱うときに超重要な概念だよ。
NULLとは
NULL(ヌル) とは、データベースや多くのプログラミング言語において「値が存在しない・不明である」状態を表す特殊な概念です。これは「0(ゼロ)」でも「空文字("")」でもなく、「そもそもデータが存在しない」ことを示す独立した概念として扱われます。
たとえば、社員テーブルに「携帯電話番号」の列があったとして、携帯を持っていない社員のセルには何を入れるべきでしょうか。0を入れると「電話番号が0」という誤った情報になり、空文字を入れると「空っぽの文字列」という別の意味になります。NULLを使うことで「電話番号が不明または存在しない」という正確な情報を表現できます。
NULLはデータの品質・整合性に大きく関わる概念であり、SQL(Structured Query Language:データベース操作言語) の仕様として標準化されています。扱いを誤るとデータ集計や検索が意図せず壊れる原因になるため、システム発注・設計の場面でも無視できない重要なポイントです。
NULLの核心:三値論理(True / False / Unknown)
通常の論理は「True(真)」か「False(偽)」の二択ですが、NULLが絡むと 「Unknown(不明)」 が加わった三値論理になります。これがNULLを難しくしている根本原因です。
| 比較式 | 結果 | 理由 |
|---|---|---|
NULL = NULL | Unknown(不明) | 「不明」同士を比べても判断できない |
NULL = 1 | Unknown(不明) | 「不明」が1かどうかわからない |
NULL IS NULL | True(真) | 「NULLかどうか」の専用構文はTrue |
NULL IS NOT NULL | False(偽) | NULLはNOT NULLではない |
NULL + 1 | NULL | NULLを含む計算結果はすべてNULL |
⚠️ よくある罠:
WHERE 電話番号 = NULLという条件は常に「Unknown」を返すため、NULLの行がヒットしません。正しくはWHERE 電話番号 IS NULLと書く必要があります。
覚え方:「NULLは伝染する」
NULLが絡む演算は結果もNULLになる、という性質を「NULLの伝染」と呼ぶことがあります。NULL + 何でも = NULL、NULL 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・空文字の比較図
関連する規格・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標準関数