NULLと空文字の違いとは?
SQLにおける NULLと空文字(”)はまったく別物 です。
- NULL:値が「存在しない」状態
- 空文字:長さ0の文字列(値は存在している)
この違いを理解していないと、
WHERE column = ''で抽出できないIS NULLが効かない- 集計結果がズレる
といったトラブルが発生します。
はじめに
SQLを書いていて「条件を書いてるのに結果が返ってこない…」と思ったことはありませんか?
もしかするとその原因は、「NULLと空文字の違い」にあるかもしれません。
この記事では、SQL初心者がつまずきやすい NULLと空文字の違いについて、
実際にSQL Serverで試せる例や、よくあるミスと正しい対処法を交えて、解説していきます。
※以降の動作確認はすべてSQL Serverでのみ行っています。他のDBMSでは挙動が異なる可能性があります。
SQLでのNULLと空文字の扱い
まずは基本的な違いから整理します。
- NULL:値が存在しない(未入力・不明)
- 空文字(”):長さ0の文字列(値は存在している)
見た目はどちらも「空」に見えますが、
SQLの中ではまったく別の扱いになります。
たとえば:
= ''ではNULLは取得できないIS NULLでは空文字は取得できない- 集計関数のCOUNTでも扱いが異なる
この違いを理解していないと、
意図しない検索結果や集計ミスの原因になります。
それでは実際に、SSMSで挙動を確認していきましょう。
SSMSで検証|NULLと空文字の違いを実際に確認する
まずはテスト用のテーブルを作成し、NULLと空文字をそれぞれ登録します。
CREATE TABLE test_null (
id INT,
value NVARCHAR(10)
);
INSERT INTO test_null VALUES (1, NULL); -- NULL
INSERT INTO test_null VALUES (2, ''); -- 空文字
INSERT INTO test_null VALUES (3, 'abc'); -- 通常の値
--結果
id value
1 NULL
2
3 abc
一見すると、id=1とid=2はどちらも「空」に見えます。
しかし、SQLの内部ではまったく異なる扱いになります。
それでは、この状態で条件検索を行ってみましょう。
ポイント①:NULLは = で比較できない
次のクエリを実行してみます。
SELECT * FROM test_null
WHERE value = NULL;
--結果
id value
結果は 0件ヒット になります。
一見正しく見えるこのクエリですが、
実は = NULL では絶対に一致しません。
なぜ取得できないのか?
SQLでは、NULLは「値がない」状態です。
そのため、NULL = NULLという比較自体が成立せず、
結果は TRUEでもFALSEでもなく「UNKNOWN(不明)」 と扱われ、WHERE句では無視されてしまいます。
正しい書き方:NULLを比較するときは、=ではなくIS NULLを使う
SELECT * FROM test_null
WHERE value IS NULL;
--結果
id value
1 NULL
ポイント②:空文字(”)とNULLの違い|両方を検索する方法
SELECT * FROM test_null
WHERE value = '';
--結果
id value
2
結果:空文字(id=2)は取れるが、NULL(id=1)は取れない
「入力されていないデータを取りたい」と思ってこのクエリを書いてしまうと、NULLの行を取り逃します。
NULLと空白の両方を含めたいときは:
SELECT * FROM test_null
WHERE value IS NULL OR value = '';
--結果
id value
1 NULL
2
※実務では「未入力」がNULLなのか空文字なのかは、システム設計によって異なります。
ポイント③:COUNT(列名)はNULLをカウントしない|COUNT(*)との違い
SELECT COUNT(value) col1
FROM test_null;
--結果
col1
2
結果:NULLを含めて3件と返ってくるように思いますが、結果は2件になります。
なぜ2件になるのか?
COUNT(列名) は NULLを除外してカウントする という仕様だからです。
今回のデータでは:
- id=1 → NULL(カウントされない)
- id=2 → 空文字(カウントされる)
- id=3 → ‘abc’(カウントされる)
そのため、結果は2になります。
全件を数えたい場合
すべての行をカウントしたい場合は、COUNT(*) を使います。
SELECT COUNT(*) AS col1
FROM test_null;
ポイント④:CHAR型に空文字を入れるとどうなる?スペース補完と比較の仕様(SQL Server)
次のテーブルを作成します。
CREATE TABLE test_char (
code CHAR(5)
);
INSERT INTO test_char VALUES ('');
このとき、CHAR(5) は固定長のデータ型なので、空文字(”)を入れても内部的には ‘ ‘(スペース5つ)として保存されます。
では、検索するときはどう書くべきか?
SELECT * FROM test_char WHERE code = ' ';
と書かないといけないのでしょうか?
SQL Serverの仕様:末尾スペースは無視される
SQL Serverには「CHAR型同士の比較では、末尾のスペースを無視する」という仕様があります。
そのため、次のように書いてもヒットします。
-- 空文字で検索してもOK
SELECT * FROM test_char WHERE code = '';
-- これでもOK
SELECT * FROM test_char WHERE code = ' ';
補足:
- この挙動はSQL Serverの仕様であり、他のDBMS(OracleやPostgreSQLなど)では異なる場合があります。
- 同じようなデータでも、VARCHAR 型なら空白の補完も比較のゆらぎも発生しません。
そのため、意図せぬ比較ミスを避けたいときは、DB設計の段階で可変長の VARCHAR を選ぶのも一つの方法です。
まとめ|SQLにおけるNULLと空文字の違い
NULLと空文字の違いは、SQLの中でも混乱しやすいポイントの一つです。
ただ、それぞれの意味や扱い方を正しく理解していれば、意図しないバグや集計ミスを防ぐことができます。
この記事で紹介したように、SSMSなどで実際に試してみると、
その違いが感覚的にも理解しやすくなるかもしれません。
最後にポイントをまとめておきます:
- NULLの比較は IS NULL / IS NOT NULL
- 空白の比較は = ”
- COUNTでNULLを含めたいときは COUNT(*)
- 固定長のCHAR型には注意(空白で埋まる)
- 空白とNULLが混在する場合は、両方を考慮して条件を書くこと
コメント