SQLでデータベースを検索していると、カラムの値が存在しない「NULL」のデータだけを取得したい場面があります。しかし、通常の値を比較するときに使う「=」演算子を使ってWHERE column = NULLと書いても、期待した結果が取得できないことがあります。
この記事では、SQLにおけるNULLの正しい扱い方、なぜ「= NULL」が機能しないのか、そしてNULLを検索・除外するための正しいSQL文について分かりやすく解説します。
SQLにおけるNULLとは何か
SQLのNULLは、「0」や空文字とは異なり、「値が存在しない」「値が不明である」ことを表す特殊な状態です。
例えば、顧客テーブルに電話番号の入力がない場合、そのカラムにはNULLが保存されることがあります。これは電話番号が「空」という意味ではなく、「まだ登録されていない」「情報が不明」という状態を示しています。
具体的には、以下のような違いがあります。
| 値 | 意味 |
|---|---|
| NULL | 値が存在しない、不明 |
| 空文字(””) | 文字列が空 |
| 0 | 数値のゼロ |
この違いを理解することが、SQLでNULLを正しく検索するための基本になります。
WHERE column = NULLでは検索できない理由
SQLでは、NULLに対して「=」演算子を使った比較は正しく評価されません。
例えば、以下のSQLを書いた場合です。
SELECT * FROM users WHERE phone = NULL;
一見すると「phoneカラムがNULLの行を取得する」という意味に見えますが、実際には条件を満たす行は取得できません。
その理由は、SQLではNULLを通常の値として比較できないためです。NULLとの比較結果は「TRUE」や「FALSE」ではなく、「UNKNOWN(不明)」という状態になります。
SQLのWHERE条件ではTRUEと判断された行だけが取得されるため、UNKNOWNとなるNULL比較は結果に含まれません。
NULLを検索する正しい書き方はIS NULL
NULLのデータを検索するときは、「IS NULL」を使用します。
正しいSQL文は以下のようになります。
SELECT * FROM users WHERE phone IS NULL;
このSQLでは、phoneカラムの値がNULLである行だけを取得できます。
例えば、顧客一覧から電話番号未登録のユーザーだけを確認したい場合などに利用できます。
SELECT name FROM customers WHERE phone_number IS NULL;
このようにIS NULLを使うことで、NULLという特殊な状態を正しく判定できます。
NULLではないデータを検索する場合はIS NOT NULL
NULLではない値だけを取得したい場合は、「IS NOT NULL」を利用します。
例えば、電話番号が登録されているユーザーだけを取得する場合は以下のように記述します。
SELECT * FROM users WHERE phone IS NOT NULL;
IS NOT NULLは、入力済みデータの確認や必須項目チェックなどでよく利用されます。
例えば、商品の在庫管理で「登録済みの商品コードだけを表示する」といった処理にも活用できます。
NULLと他の条件を組み合わせる場合の注意点
SQLでは、NULLを含む条件式を作る場合にも注意が必要です。
例えば、以下のような条件ではNULLの行は取得されません。
SELECT * FROM users WHERE age > 20;
ageカラムがNULLの場合、年齢が20歳以上かどうか判断できないため、条件結果はUNKNOWNになります。
NULLも含めて処理したい場合は、IS NULLなどを組み合わせて明示的に条件を指定する必要があります。
例として、年齢が20歳以上、または未登録のユーザーを取得する場合は以下のようになります。
SELECT * FROM users WHERE age >= 20 OR age IS NULL;
データベースごとのNULLの扱いについて
SQLの基本仕様としてNULLの扱いは多くのデータベースで共通しています。MySQL、PostgreSQL、Oracle Database、SQL Serverなどでも、NULL検索にはIS NULLを使用します。
ただし、NULLと空文字の扱いや関数の挙動など、一部の細かな仕様はデータベース製品によって異なる場合があります。
そのため、特定のデータベース環境で開発する場合は、利用しているDBMSの仕様も確認するとより安全です。
まとめ
SQLでNULLの行を検索する場合、「WHERE column = NULL」と書くのは正しい方法ではありません。
NULLは通常の値とは異なる特殊な状態であるため、比較演算子の「=」では判定できず、「IS NULL」を使用する必要があります。
NULLを検索するときは「IS NULL」、NULLではないデータを検索するときは「IS NOT NULL」と覚えておくことで、SQLの条件指定で起こりやすいミスを防ぐことができます。


コメント