青の統計学-DS Playground-

NULLと欠損: IS NULL / COALESCEの基本

Stage 1 — 第5章 | データ分析基礎カリキュラム 推定学習時間:35〜45分 | 難易度:★★☆☆☆


この章で学ぶこと

実務データには、値が入っていない場所がよくあります。 顧客の都道府県が未入力、商品の価格が未設定、注文のキャンセル日が空欄、といったケースです。

SQLでは、この「値がない」状態を NULL と呼びます。 NULLは0や空文字とは違い、扱いを間違えると集計や条件抽出の結果がずれてしまいます。

この章を終えると、こんなことができるようになります:

  • NULLが何を表すか説明できる
  • IS NULL / IS NOT NULL で欠損行を抽出できる
  • = NULL が使えない理由を理解できる
  • COALESCE で表示や集計用の代替値を作れる

1. NULLは「値がない」ことを表す

NULLは、データベース上で「値が入っていない」「不明」「該当なし」を表すために使われます。

たとえば customers テーブルに次のような行があるとします。

customer_id customer_name prefecture registered_at
C001 Aさん 東京都 2026-01-05
C002 Bさん NULL 2026-01-06
C003 Cさん 大阪府 2026-01-07

C002の prefecture はNULLです。 これは、都道府県が「東京都ではない」という意味ではありません。 値が入力されていない、または不明という意味です。

NULLは次の値とは違います。

意味
NULL 値がない・不明
0 数値としてのゼロ
'' 空の文字列
'不明' 「不明」という文字列

この違いは、SQLを学ぶうえで非常に重要です。


2. IS NULLで欠損行を探す

NULLの行を探すには、IS NULL を使います。

SELECT
            customer_id,
            customer_name,
            prefecture
          FROM customers
          WHERE prefecture IS NULL;
          

これは、都道府県が未入力の顧客を取り出します。 データ品質チェックでは、まず重要な列にNULLがどれくらいあるかを確認します。

反対に、NULLではない行を取り出すには IS NOT NULL を使います。

SELECT
            customer_id,
            customer_name,
            prefecture
          FROM customers
          WHERE prefecture IS NOT NULL;
          

これは、都道府県が入力されている顧客だけを取り出します。


3. = NULL と書いてはいけない

初学者がよく間違えるのが、次の書き方です。

SELECT
            customer_id,
            customer_name
          FROM customers
          WHERE prefecture = NULL;
          

これは意図通りに動きません。 NULLは「値がない」状態なので、通常の = で比較できないためです。

NULLを判定するときは、必ず次のように書きます。

WHERE prefecture IS NULL
          

または、NULLでないことを判定します。

WHERE prefecture IS NOT NULL
          

比較演算子ではなく、NULL専用の判定を使うと覚えましょう。


4. NULLがあると条件結果が直感とずれることがある

次のSQLを考えます。

SELECT
            product_id,
            product_name,
            price
          FROM products
          WHERE price >= 1000;
          

price がNULLの商品は、この条件に一致しません。 NULLは1000以上でも1000未満でもないためです。

では、次のSQLはどうでしょうか。

SELECT
            product_id,
            product_name,
            price
          FROM products
          WHERE price < 1000;
          

この場合も、price がNULLの商品は一致しません。 NULLは1000未満とも判断できません。

つまり、NULLを含む列で条件を書くときは、NULLをどう扱うかを明示する必要があります。

SELECT
            product_id,
            product_name,
            price
          FROM products
          WHERE price < 1000
             OR price IS NULL;
          

このSQLは、価格が1000円未満、または価格未設定の商品を取り出します。


5. COALESCEで代替値を表示する

NULLをそのまま表示すると、レポート上で読みづらいことがあります。 そのようなときは COALESCE を使います。

SELECT
            customer_id,
            customer_name,
            COALESCE(prefecture, '未入力') AS prefecture_label
          FROM customers;
          

COALESCE(prefecture, '未入力') は、prefecture がNULLでなければその値を返し、NULLなら '未入力' を返します。

prefecture COALESCEの結果
東京都 東京都
NULL 未入力
大阪府 大阪府

COALESCE は、表示用のラベルを作るときによく使います。


6. 数値列でCOALESCEを使うときの注意

数値列でも COALESCE は使えます。

SELECT
            product_id,
            product_name,
            COALESCE(price, 0) AS display_price
          FROM products;
          

このSQLは、価格がNULLの商品を0円として表示します。

ただし、分析上は注意が必要です。 NULLは「価格が0円」ではなく「価格が未設定」かもしれません。 それを0に置き換えると、平均価格や合計金額が実態とずれる可能性があります。

目的 COALESCEの使い方
画面表示 NULL'未入力'0 に置き換えることがある
集計・分析 置き換えが妥当かを確認してから使う
データ品質確認 まずNULLの件数や割合を見る

COALESCEは便利ですが、欠損を「なかったこと」にする道具ではありません。 何に置き換えたのかを説明できることが大切です。


7. 実務でよくあるNULLの例

未入力の顧客属性

SELECT
            customer_id,
            customer_name,
            prefecture
          FROM customers
          WHERE prefecture IS NULL;
          

登録フォームで任意入力になっている項目はNULLになりやすいです。 地域別分析をする前に、欠損が多すぎないか確認します。

キャンセルされていない注文

注文テーブルに cancelled_at という列がある場合、キャンセルされていない注文ではNULLになることがあります。

SELECT
            order_id,
            order_date,
            status
          FROM orders
          WHERE cancelled_at IS NULL;
          

この場合のNULLは「不明」ではなく「該当なし」に近い意味です。 同じNULLでも、業務上の意味は列によって違います。

未設定の商品価格

SELECT
            product_id,
            product_name,
            price
          FROM products
          WHERE price IS NULL;
          

価格がNULLの商品があると、売上計算や商品一覧に影響します。 分析前のチェック対象になります。


8. NULLを見つけたら、まず意味を確認する

NULLを見つけたとき、すぐに削除したり0に置き換えたりするのは危険です。 まず、そのNULLが何を意味するのかを確認します。

  • 入力漏れなのか
  • まだ発生していないイベントなのか
  • その項目が対象外なのか
  • データ連携時に欠落したのか
  • 本来は別の値で埋めるべきなのか

欠損処理は、SQLの技術だけでなく業務理解とセットです。 データ分析では、NULLの扱いを明記することで、結果の信頼性が高まります。


実務での使いどころ: NULLは欠陥ではなく意味を持つ

NULLを見つけたとき、すぐに0や空文字へ置き換えるのは危険です。 NULLには「未入力」「まだ発生していない」「対象外」「連携できていない」など、複数の意味があります。

たとえば、注文キャンセル日 cancelled_at がNULLなら、キャンセルされていない注文を表している可能性があります。 一方で、商品の価格 price がNULLなら、商品マスタの不備かもしれません。

NULLがある列 あり得る意味 対応の考え方
prefecture 顧客が未入力 未入力として集計するか除外する
cancelled_at キャンセルされていない 正常なNULLとして扱う
price 価格未設定 データ品質問題として確認する
last_login_at まだログインしていない 未行動ユーザーとして分析する

COALESCEは表示を分かりやすくするには便利ですが、元のNULLの意味を消してしまうことがあります。 置き換える前に、NULLが何を表しているかを確認しましょう。

ミニ演習

次のNULLについて、0や空文字に置き換えてよいか考えてください。

  1. customers.prefecture がNULL。
  2. orders.cancelled_at がNULL。
  3. products.price がNULL。
  4. users.last_login_at がNULL。

それぞれについて、「正常なNULL」か「確認すべきNULL」かを分類してみましょう。


まとめ

構文 意味
IS NULL NULLの行を探す prefecture IS NULL
IS NOT NULL NULLではない行を探す price IS NOT NULL
COALESCE NULLのとき代替値を返す COALESCE(prefecture, '未入力')
= NULL 使わない NULL判定には不適切

この章のキーメッセージ: NULLは0でも空文字でもなく、「値がない」状態です。条件抽出では IS NULL を使い、置き換えるときは分析上の意味を必ず確認しましょう。


この章の確認

  1. NULLと0、空文字はどのように違いますか?
  2. customers テーブルで prefecture が未入力の顧客を取り出すSQLを書いてください。
  3. WHERE price = NULL が適切でない理由を説明してください。
  4. COALESCE(prefecture, '未入力') は、どのような値を返しますか?

関連演習