SQLを使っていると必ず出会うのが NULL です。個人的には結構やっかいな存在だと思っています。
NULLって0と同じ?空文字とどう違うの?と、はじめのうちは混乱する方が多いでしょう。
この記事では、NULLの基本的な意味や使い方、注意点を解説します。
※基本的にはSQL ServerでのNULLの解説となります。
Table of Contents
NULLとは?
NULLは 「値が存在しない」状態 を表します。
- 0(ゼロ)ではない
- 空文字(”)でもない
- 値が「未定義」「不明」「存在しない」ことを意味する特別な値
例:
SELECT * FROM Customers WHERE PhoneNumber IS NULL;
これは電話番号(PhoneNumber)が登録されていない顧客を取得します。
NULLの確認方法
NULLは =
や<>
では確認・比較できません。条件文は以下のように書きます。
やりたいこと | 書き方 |
---|---|
NULLを探す | WHERE 列 IS NULL |
NULL以外を探す | WHERE 列 IS NOT NULL |
例:
SELECT * FROM Orders WHERE ShippedDate IS NULL;
NULLを含む計算の注意点
NULLを含む計算式は常にNULLになります。
例:
SELECT 1 + NULL; --結果: NULL
対策として ISNULL()
や COALESCE()
を使います。
NULL対策の便利関数
- ISNULL(列, 代替値)
“列”の値がNULLかどうか判定して、NULLなら”代替値”を返す。
例:
SELECT ISNULL(PhoneNumber, '未登録') FROM Customers;
--PhoneNumberの値がNULL以外ならその値を、PhoneNumberの値がNULLなら「未登録」を返す
※他のDBでも同様の関数があります。例:Oracle⇒NVL(列,代替値)
、Mysql・SQLite⇒IFNULL(列,代替値)
- COALESCE(列1, 列2, …, 列n, 代替値)
左から順にNULLでない値を返す。(CASE文の簡易版)
例:
SELECT COALESCE(MobilePhone, HomePhone, '未登録') FROM Customers;
NULLを考慮した条件分岐
NULLを扱うときは論理演算にも注意が必要です。
例:
SELECT * FROM Products WHERE Price > 100 OR Price IS NULL;
NULLの行も含めて取得したい場合、Price > 100
だけではNULLの行は取得できないため、上記のように書きます。
まとめ
- 比較の際、
= NULL
、<> NULL
は使えない →IS NULL
、IS NOT NULL
を使う - NULLを含む計算はNULLになる
- 集計関数(SUM、AVGなど)はNULLを自動的に除外する