SQLにおける「NULL」は、データベースの中で特別な意味を持つ重要な概念です。
しかし、最初はその挙動や役割が少し分かりにくく、混乱しがちです。
NULLの扱い方を間違えるとバグにつながり、システム障害にまで発展する恐れもあります。
NULLが何を意味するのか、どのように扱えばよいのかについて、簡単にまとめます。
NULLとは何か?
NULLとは、「値が存在しない」ことを表す特別なマーカーです。
これは「0」や空の文字列 ''
とは異なり、「値そのものが不明」または「値が設定されていない」状態を意味します。
たとえば、あるデータベースに社員の電話番号を管理するテーブルがあり、社員Aは電話番号が登録されていないとしましょう。
この場合、社員Aの電話番号欄には「NULL」が設定されます。
これは、単に「電話番号が登録されていない」という状態を示します。
電話番号が「0」や「空の文字列」ではなく、「まだ知られていない」という意味を持ちます。
NULLの具体例
SELECT 名前, 電話番号
FROM 社員;
名前 | 電話番号 |
---|---|
田中 | 999-1234-5678 |
鈴木 | NULL |
佐藤 | 999-9876-5432 |
この例では、鈴木さんの電話番号が登録されておらず、そのフィールドには NULL
が格納されています。
これは、電話番号が未設定であることを意味しています。
NULLの基本的な特性
NULLは他のデータと異なり、以下の特性を持っています。
NULLは不明
NULLは「不明な値」であり、そのままでは他の値と比較したり計算することができません。これは次の点で重要です。
NULL = NULL
はTRUE
にはなりません。
両方とも「不明な値」なので、比較結果はやはり「不明(NULL)」となります。NULL + 1
などの計算はNULL
になります。
何かに「不明な値」を足しても、結果がどうなるかはわからないという扱いです。
NULLと他の値の比較
=
(等しい)や !=
(等しくない)などの比較演算子は、NULLに対して期待通りに動作しません。
たとえば、次のクエリを見てみましょう。
SELECT *
FROM 社員
WHERE 電話番号 = NULL;
このクエリは、NULL
は「不明」なので、電話番号 = NULL
の条件は常にFALSEとなり、どの行も返されません。NULLを適切に扱うには、IS NULL
または IS NOT NULL
を使う必要があります。
SELECT *
FROM 社員
WHERE 電話番号 IS NULL;
これによって、電話番号が登録されていない社員(つまり電話番号がNULLの社員)のみが選ばれます。
NULLを扱うためのSQLの便利な機能
NULLを正しく扱うために、SQLにはいくつかの便利な機能・構文が用意されています。
IS NULL / IS NOT NULL
NULLをチェックするには、IS NULL
または IS NOT NULL
を使用します。
これにより、NULLの行を正確に判別できます。
-- 電話番号がNULLの社員を取得
SELECT 名前
FROM 社員
WHERE 電話番号 IS NULL;
-- 電話番号が登録されている社員を取得
SELECT 名前
FROM 社員
WHERE 電話番号 IS NOT NULL;
COALESCE関数
COALESCE
関数は、NULLを他の値で置き換える際に役立ちます。
たとえば、NULLの場合に「未登録」と表示したいときには次のようにします。
SELECT 名前, COALESCE(電話番号, '未登録') AS 電話番号
FROM 社員;
このクエリでは、電話番号がNULLの社員については「未登録」と表示されます。
名前 | 電話番号 |
---|---|
田中 | 999-1234-5678 |
鈴木 | 未登録 |
佐藤 | 999-9876-5432 |
IFNULL / NULLIF
SQLでは、データベースの種類によって IFNULL
や NULLIF
などの関数も使えます。
IFNULL(値, 置換値)
は、値がNULLの場合に指定した置換値を返します。NULLIF(値1, 値2)
は、値1が値2と等しい場合にNULLを返します。
それ以外の場合は値1を返します。
NULLの注意点
NULLの扱いにはいくつか注意が必要です。
NULLを含むカラムでの計算やフィルタリングには特別な考慮が必要です。
集計関数との組み合わせ
集計関数(SUM、COUNT、AVGなど)はNULLを無視します。
ただし、COUNT関数には注意が必要です。
COUNT(*)
はNULLも含めた全行をカウントしますが、COUNT(カラム名)
はそのカラムがNULLでない行だけをカウントします。
テーブル内の行数をカウント
SELECT COUNT(*) FROM 社員; -- 全行をカウント
-- 電話番号がNULLでない行数をカウント
SELECT COUNT(電話番号) FROM 社員; -- NULLを除いた行数をカウント
まとめ
NULLは「値が存在しない」ことを示す特殊な値であり、「0」や「空文字」とは異なります。NULLを扱う際には、IS NULL
や COALESCE
などの専用の機能を使い、正確にデータを処理することが重要です。
NULLの正しい理解と適切な使い方は、SQLを活用する上で欠かせないスキルです。しっかりと基礎を押さえておくことで、データベース操作のミスを防ぐことができます。