【SQL初心者向け】NULLと空文字の違いとは?初心者向けに徹底解説(SQL Server)

Uncategorized

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が混在する場合は、両方を考慮して条件を書くこと

コメント

タイトルとURLをコピーしました