SQL ServerでNULLを扱う方法|初心者向けにわかりやすく解説

SQL Serverを使ってデータベースを操作していると、必ずといっていいほど出てくるのがNULLです。
テーブルの中に値が入っていない列を見て、「空白なのか」「0なのか」「空文字なのか」「NULLなのか」がよくわからず混乱した経験がある方も多いのではないでしょうか。

特に初心者のうちは、NULLを単なる「空の値」と考えてしまいがちです。
しかし、SQL ServerにおけるNULLは、単なる空白ではなく、値が存在しないことを表す特別な状態です。
この性質を正しく理解していないと、検索結果が想定と違ったり、条件分岐がうまく動かなかったり、集計結果がおかしくなったりすることがあります。

たとえば、次のような疑問を持つことはよくあります。

  • NULLと空文字は何が違うのか

  • = NULL で比較してはいけないのはなぜか

  • IS NULL はいつ使うのか

  • NULLを0や空文字に置き換えるにはどうすればいいのか

  • ISNULLCOALESCE はどう違うのか

  • 集計関数でNULLはどう扱われるのか

この記事では、SQL ServerでNULLを扱う方法について、初心者向けに基礎からわかりやすく解説します。
単なる文法説明だけでなく、実際のSQL例を交えながら、よくあるミスや実務での考え方まで丁寧にまとめています。


NULLとは何か

まず最初に、NULLの意味をしっかり押さえておきましょう。

SQL ServerにおけるNULLは、値が存在しない、または不明であることを表します。
これは次のような値とは異なります。

  • 0

  • 空文字 ''

  • 半角スペース ' '

  • 日付の初期値

  • FalseやNoのような意味を持つ値

NULLは、「値がまだ入っていない」「値が存在しない」「値が不明」といった状態を表現するための特別な概念です。

たとえば次のようなケースです

  • 顧客の電話番号が未登録

  • 退職日がまだ決まっていない

  • コメント欄が未入力

  • 更新日時が未設定

  • 売上金額が未計算

このようなとき、無理に0や空文字を入れるのではなく、NULLを使うことで「値がない」という状態を正しく表現できます。


NULLと空文字の違い

初心者が特に混乱しやすいのが、NULLと空文字の違いです。

NULL

値そのものが存在しません。

空文字 ''

長さ0の文字列です。
つまり、「値は存在しているが、中身が空の文字列」です。

この違いはとても重要です。

たとえば、次の2つは見た目が似ていても意味が異なります。

NULL
''

前者は「値がない」、後者は「空の文字列が入っている」という状態です。

SELECT
CASE WHEN NULL IS NULL THEN 'NULLです' ELSE 'NULLではありません' END;

これはNULLとして扱われます。

一方で、空文字は文字列として扱われます。

SELECT
CASE WHEN '' = '' THEN '空文字です' ELSE '空文字ではありません' END;

こちらは通常の比較が可能です。


なぜ = NULL では比較できないのか

SQL ServerでNULLを扱うとき、最初につまずきやすいのがこれです。

多くの初心者は次のように書いてしまいます。

SELECT *
FROM Users
WHERE Email = NULL;

しかし、この書き方ではNULLの行は取得できません

なぜなら、NULLは「不明な値」なので、通常の等価比較 = では判定できないからです。
SQLでは、NULLとの比較結果はTRUEでもFALSEでもなく、**UNKNOWN(不明)**として扱われます。

そのため、NULLかどうかを判定したい場合は、必ず次のように書く必要があります。

SELECT *
FROM Users
WHERE Email IS NULL;

逆に、NULLではない値を取得したい場合は次のようにします。

SELECT *
FROM Users
WHERE Email IS NOT NULL;

NULLを判定する基本構文

NULLを扱うときに最も基本となるのは、次の2つの構文です。

IS NULL

列の値がNULLかどうかを判定します。

SELECT *
FROM Employees
WHERE PhoneNumber IS NULL;

このSQLは、電話番号が登録されていない社員を取得します。

IS NOT NULL

列の値がNULLではないかどうかを判定します。

SELECT *
FROM Employees
WHERE PhoneNumber IS NOT NULL;

このSQLは、電話番号が登録されている社員を取得します。


サンプルテーブルでNULLを確認してみる

ここでは具体例として、次のようなテーブルを考えます。

CREATE TABLE Employees (
EmployeeID INT,
EmployeeName NVARCHAR(100),
Department NVARCHAR(100),
PhoneNumber NVARCHAR(20),
Bonus MONEY
);

データを入れてみます。

INSERT INTO Employees (EmployeeID, EmployeeName, Department, PhoneNumber, Bonus)
VALUES
(1, '田中', '営業', '090-1111-1111', 50000),
(2, '佐藤', '総務', NULL, NULL),
(3, '鈴木', '開発', '', 30000),
(4, '高橋', NULL, '090-2222-2222', NULL);

このデータでは、次のような違いがあります。

  • 佐藤さんの PhoneNumber は NULL

  • 鈴木さんの PhoneNumber は空文字

  • 高橋さんの Department は NULL

  • Bonus は一部NULL

これによって、NULLと空文字の違いを確認しやすくなります。


NULLのデータを検索する方法

NULLの行だけ取得する

SELECT *
FROM Employees
WHERE PhoneNumber IS NULL;

このSQLでは、電話番号がNULLの社員だけが取得されます。

NULLではない行を取得する

SELECT *
FROM Employees
WHERE Bonus IS NOT NULL;

このSQLでは、賞与が設定されている社員だけが取得されます。

空文字も一緒に探したい場合

NULLだけではなく、空文字も未入力として扱いたいことがあります。
その場合は、次のように書きます。

SELECT *
FROM Employees
WHERE PhoneNumber IS NULL
OR PhoneNumber = '';

これで、NULLと空文字の両方を取得できます。


NULLを別の値に置き換える方法

実務では、NULLのままだと扱いにくいため、表示時に別の値へ置き換えたい場面がよくあります。
そのときに使われる代表的な関数が ISNULLCOALESCE です。


ISNULLの使い方

ISNULL は、指定した値がNULLだった場合に、代わりの値を返す関数です。

基本構文

ISNULL(対象の値, NULLのときに返す値)

例1: NULLを0に置き換える

SELECT
EmployeeName,
ISNULL(Bonus, 0) AS BonusAmount
FROM Employees;

このSQLでは、BonusがNULLなら0を返します。

例2: NULLを文字列に置き換える

SELECT
EmployeeName,
ISNULL(PhoneNumber, '未登録') AS Phone
FROM Employees;

このSQLでは、電話番号がNULLなら「未登録」と表示されます。

ISNULLのポイント

  • シンプルでわかりやすい

  • NULLを別の値に置き換える用途でよく使う

  • SQL Serverでよく使われる

  • 戻り値の型に注意が必要


COALESCEの使い方

COALESCE もNULLを別の値に置き換えるために使われますが、複数の候補から最初のNULLではない値を返せる点が特徴です。

基本構文

COALESCE(値1, 値2, 値3, ...)

左から順に見ていき、最初にNULLではない値を返します。

例1: BonusがNULLなら0を返す

SELECT
EmployeeName,
COALESCE(Bonus, 0) AS BonusAmount
FROM Employees;

見た目としてはISNULLと似ています。

例2: 複数候補から最初の値を取得する

SELECT
EmployeeName,
COALESCE(PhoneNumber, Department, '情報なし') AS ContactInfo
FROM Employees;

このSQLでは、次の順で値を判定します。

  1. PhoneNumber

  2. Department

  3. どちらもNULLなら「情報なし」

このように、複数の列や候補の中から最初に使える値を返したいときに便利です。


ISNULLとCOALESCEの違い

初心者が悩みやすいポイントなので、ここで整理しておきます。

ISNULL

  • SQL Server独自の関数

  • 引数は2つ

  • シンプルで使いやすい

  • 単純なNULL置換に向いている

COALESCE

  • 標準SQLに近い書き方

  • 引数を複数指定できる

  • 最初のNULLではない値を返せる

  • 複数候補を扱うときに便利

どちらを使えばいいのか

単純に1つの値を置き換えたいだけなら、ISNULL で十分なことが多いです。

ISNULL(Bonus, 0)

一方で、複数候補の中から使える値を順番に探したいなら COALESCE が向いています。

COALESCE(PhoneNumber, MobileNumber, '未登録')

CASE式でNULLを扱う方法

NULLの扱いをもっと細かく制御したい場合は、CASE 式も便利です。

例: NULLならメッセージを表示する

SELECT
EmployeeName,
CASE
WHEN Bonus IS NULL THEN '賞与なし'
ELSE '賞与あり'
END AS BonusStatus
FROM Employees;

このSQLでは、BonusがNULLなら「賞与なし」、そうでなければ「賞与あり」と表示します。

例: NULLと空文字をまとめて判定する

SELECT
EmployeeName,
CASE
WHEN PhoneNumber IS NULL OR PhoneNumber = '' THEN '未登録'
ELSE PhoneNumber
END AS PhoneDisplay
FROM Employees;

表示ルールが複雑な場合は、ISNULLやCOALESCEよりCASE式のほうがわかりやすいこともあります。


WHERE句でNULLを扱うときの注意点

WHERE句でNULLを使うときは、普通の比較演算子では思ったように動かないことがあります。

誤った例

SELECT *
FROM Employees
WHERE Bonus <> NULL;

これでは正しく判定できません。

正しい例

SELECT *
FROM Employees
WHERE Bonus IS NOT NULL;

NULLを含む条件分岐に注意

たとえば、次のような条件を書くとします。

SELECT *
FROM Employees
WHERE Bonus > 10000;

この場合、BonusがNULLの行は条件判定できないため、結果に含まれません。
NULLは0として扱われるわけではないので注意が必要です。


ORDER BYでNULLを扱うとどうなるか

並び替えを行うとき、NULLの行がどこに来るかが気になることがあります。

SELECT *
FROM Employees
ORDER BY Bonus ASC;

このとき、NULLの並び位置はDBの評価ルールに影響されるため、意図的に制御したい場合は CASE を使うことがあります。

例: NULLを最後にしたい

SELECT *
FROM Employees
ORDER BY
CASE WHEN Bonus IS NULL THEN 1 ELSE 0 END,
Bonus ASC;

これにより、BonusがNULLの行を最後に回し、その後で数値順に並び替えられます。


集計関数でNULLはどう扱われるのか

NULLは集計でも非常に重要です。
特に COUNTSUMAVG の挙動は理解しておく必要があります。


COUNTでNULLを扱う場合

COUNT(*)

全行数を数えます。NULLがあっても関係ありません。

SELECT COUNT(*)
FROM Employees;

COUNT(列名)

指定した列でNULLではない行だけを数えます。

SELECT COUNT(Bonus)
FROM Employees;

この場合、BonusがNULLの行はカウントされません。

違いの例

もしEmployeesに4行あって、そのうちBonusがNULLの行が2件なら、

  • COUNT(*) は 4

  • COUNT(Bonus) は 2

になります。


SUMでNULLを扱う場合

SUM はNULLを無視して合計します。

SELECT SUM(Bonus)
FROM Employees;

BonusがNULLの行は計算対象に含まれません。

NULLを0として扱いたい場合

SELECT SUM(ISNULL(Bonus, 0))
FROM Employees;

通常はSUM自体がNULLを無視するので問題ないことが多いですが、計算ロジックを明示したい場合はこのように書くこともあります。


AVGでNULLを扱う場合

AVG もNULLを無視して平均を計算します。

SELECT AVG(Bonus)
FROM Employees;

NULLの行は除外されるため、「全員の平均」ではなく「Bonusが入っている人だけの平均」になります。

もしNULLを0として平均を計算したいなら、意図的に変換する必要があります。

SELECT AVG(ISNULL(Bonus, 0))
FROM Employees;

ただし、これは意味が変わるので注意してください。
NULLを0とみなしてよいかどうかは業務ルールによります。


JOINでNULLを扱うときの注意点

JOINでもNULLは初心者がつまずきやすいポイントです。

たとえば、部署コードなどでテーブルを結合するとします。

SELECT e.EmployeeName, d.DepartmentName
FROM Employees e
LEFT JOIN Departments d
ON e.Department = d.DepartmentCode;

もし e.Department がNULLなら、通常は一致しないため、結合先の値は取得されません。

JOIN条件でNULL比較をしたい場合

NULL同士を一致とみなしたい特殊なケースでは、単純な = ではなく工夫が必要です。

たとえば、以下のように置き換えて比較することがあります。

SELECT *
FROM TableA a
JOIN TableB b
ON ISNULL(a.Code, '') = ISNULL(b.Code, '');

ただし、この方法は業務要件によっては意図しない一致を生むこともあるため、慎重に使う必要があります。


INSERTでNULLを入れる方法

NULLを明示的に登録したい場合は、INSERT文で NULL を指定します。

INSERT INTO Employees (EmployeeID, EmployeeName, Department, PhoneNumber, Bonus)
VALUES (5, '中村', '人事', NULL, NULL);

また、列がNULLを許可している場合は、その列を省略してINSERTすることもあります。

INSERT INTO Employees (EmployeeID, EmployeeName)
VALUES (6, '小林');

この場合、省略した列にデフォルト値がなければNULLが入ります。


UPDATEでNULLを設定する方法

既存データをNULLにしたい場合は、UPDATE文で NULL を代入します。

UPDATE Employees
SET PhoneNumber = NULL
WHERE EmployeeID = 1;

これで電話番号を未設定状態に戻せます。


NULLを許可する列と許可しない列

テーブル作成時には、列ごとにNULLを許可するかどうかを決められます。

NULLを許可する例

CREATE TABLE Customers (
CustomerID INT NOT NULL,
CustomerName NVARCHAR(100) NOT NULL,
Email NVARCHAR(200) NULL
);

NULLを許可しない例

CREATE TABLE Products (
ProductID INT NOT NULL,
ProductName NVARCHAR(100) NOT NULL,
Price DECIMAL(10,2) NOT NULL
);

必須項目には NOT NULL を設定し、未設定があり得る項目には NULL を許可するのが基本です。


実務でよくあるNULLの扱い方

実務では、NULLをどう扱うかを最初に設計しておくことが大切です。

1. NULLと空文字を混在させない

同じ「未入力」でも、あるデータはNULL、別のデータは空文字、という状態になると後で扱いにくくなります。

2. 必須項目にはNOT NULLを使う

業務上必須なら、アプリ側だけでなくDB側でも制約をかけておくと安全です。

3. 表示時だけ置き換える

DB内の本来の値はNULLのまま保持し、画面表示や帳票出力時だけ ISNULLCOALESCE で変換するのが一般的です。

4. 集計時はNULLをどう解釈するか決める

NULLを0として扱うのか、未計上として除外するのかで結果が大きく変わるため、業務ルールの確認が必要です。


初心者がやりがちなNULLのミス

NULLを扱うとき、初心者がよくやってしまうミスがあります。

= NULL と書いてしまう

これは非常によくあるミスです。
必ず IS NULL を使います。

空文字とNULLを同じだと思う

両者は別物です。
検索や集計結果が変わるので注意が必要です。

SUMやAVGがNULLを無視することを知らない

集計結果が想定と違う原因になりやすいです。

なんでもISNULLで置き換える

便利ですが、業務上「NULLのまま扱うべきか」を考えずに変換すると、意味が変わってしまうことがあります。

NULLを許可する設計にしすぎる

全部の列をNULL可にしてしまうと、データ品質が悪化しやすくなります。


実践例:NULLを含むデータを見やすく表示するSQL

最後に、実務でよくある「NULLをユーザーにわかりやすく表示したい」例を紹介します。

SELECT
EmployeeID,
EmployeeName,
ISNULL(Department, '未設定') AS Department,
CASE
WHEN PhoneNumber IS NULL OR PhoneNumber = '' THEN '未登録'
ELSE PhoneNumber
END AS PhoneNumber,
ISNULL(CAST(Bonus AS NVARCHAR), '賞与なし') AS Bonus
FROM Employees;

このSQLでは次のように工夫しています。

  • DepartmentがNULLなら「未設定」

  • PhoneNumberがNULLまたは空文字なら「未登録」

  • BonusがNULLなら「賞与なし」

このように、NULLの扱いは単なる文法知識ではなく、どう見せるか、どう集計するか、どう設計するかまで含めて考えることが大切です。


よくある質問

SQL ServerでNULLと空文字は同じですか?

違います。
NULLは値が存在しない状態で、空文字は長さ0の文字列です。見た目は似ていますが、SQL上では別物です。

SQL ServerでNULLを検索するときはどう書けばいいですか?

NULLを検索するときは IS NULL を使います。

SELECT * FROM Employees WHERE PhoneNumber IS NULL;

NULLではない行を検索したい場合は IS NOT NULL を使います。

ISNULLとCOALESCEはどちらを使えばいいですか?

単純なNULL置換なら ISNULL がわかりやすいです。
複数候補の中から最初のNULLではない値を取りたいなら COALESCE が便利です。

COUNT(列名)でNULLは数えられますか?

数えられません。
COUNT(列名) はNULLではない値だけをカウントします。
全行数を数えたいなら COUNT(*) を使います。

AVGやSUMでNULLはどうなりますか?

通常、NULLは無視されます。
NULLを0として扱いたい場合は ISNULL などで明示的に変換する必要があります。


まとめ

SQL ServerでNULLを正しく扱えるようになると、検索、更新、集計、表示のすべてが安定します。
初心者のうちは難しく感じるかもしれませんが、まずは次のポイントを押さえるだけでもかなり理解しやすくなります。

  • NULLは「空白」ではなく「値がない」状態

  • = NULL ではなく IS NULL を使う

  • NULLと空文字は別物

  • NULLの置換には ISNULLCOALESCE を使う

  • 集計関数ではNULLが無視されることが多い

  • 設計時にNULLを許可するかどうかを明確にする

NULLはSQLの基本でありながら、実務では非常に重要なテーマです。
なんとなく扱うのではなく、意味を理解したうえで使い分けることで、バグや誤集計を大きく減らせます。

SQL Server初心者の方は、まず IS NULLIS NOT NULLISNULLCOALESCE の4つをしっかり使えるようになるところから始めるのがおすすめです。

Si quieres conocer otros artículos parecidos a SQL ServerでNULLを扱う方法|初心者向けにわかりやすく解説 puedes visitar la categoría Puroguramingu.

Go up