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や空文字に置き換えてよいか考えてください。
customers.prefectureがNULL。orders.cancelled_atがNULL。products.priceがNULL。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 を使い、置き換えるときは分析上の意味を必ず確認しましょう。
この章の確認
- NULLと0、空文字はどのように違いますか?
customersテーブルでprefectureが未入力の顧客を取り出すSQLを書いてください。WHERE price = NULLが適切でない理由を説明してください。COALESCE(prefecture, '未入力')は、どのような値を返しますか?