SQLを使っていると必ず出会うのが NULL です。個人的には結構やっかいな存在だと思っています。
NULLって0と同じ?空文字とどう違うの?と、はじめのうちは混乱する方が多いでしょう。

この記事では、NULLの基本的な意味や使い方、注意点を解説します。
※基本的にはSQL ServerでのNULLの解説となります。

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対策の便利関数

  1. ISNULL(列, 代替値)
    “列”の値がNULLかどうか判定して、NULLなら”代替値”を返す。

例:

SELECT ISNULL(PhoneNumber, '未登録') FROM Customers; 
--PhoneNumberの値がNULL以外ならその値を、PhoneNumberの値がNULLなら「未登録」を返す

※他のDBでも同様の関数があります。例:Oracle⇒NVL(列,代替値)、Mysql・SQLite⇒IFNULL(列,代替値)

  1. 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 NULLIS NOT NULL を使う
  • NULLを含む計算はNULLになる
  • 集計関数(SUM、AVGなど)はNULLを自動的に除外する