SQL ServerでNULLを扱う方法|初心者向けにわかりやすく解説
SQL Serverを使ってデータベースを操作していると、必ずといっていいほど出てくるのがNULLです。
テーブルの中に値が入っていない列を見て、「空白なのか」「0なのか」「空文字なのか」「NULLなのか」がよくわからず混乱した経験がある方も多いのではないでしょうか。
特に初心者のうちは、NULLを単なる「空の値」と考えてしまいがちです。
しかし、SQL ServerにおけるNULLは、単なる空白ではなく、値が存在しないことを表す特別な状態です。
この性質を正しく理解していないと、検索結果が想定と違ったり、条件分岐がうまく動かなかったり、集計結果がおかしくなったりすることがあります。
たとえば、次のような疑問を持つことはよくあります。
-
NULLと空文字は何が違うのか
-
= NULLで比較してはいけないのはなぜか -
IS NULLはいつ使うのか -
NULLを0や空文字に置き換えるにはどうすればいいのか
-
ISNULLとCOALESCEはどう違うのか -
集計関数でNULLはどう扱われるのか
この記事では、SQL ServerでNULLを扱う方法について、初心者向けに基礎からわかりやすく解説します。
単なる文法説明だけでなく、実際のSQL例を交えながら、よくあるミスや実務での考え方まで丁寧にまとめています。
NULLとは何か
まず最初に、NULLの意味をしっかり押さえておきましょう。
SQL ServerにおけるNULLは、値が存在しない、または不明であることを表します。
これは次のような値とは異なります。
-
0
-
空文字
'' -
半角スペース
' ' -
日付の初期値
-
FalseやNoのような意味を持つ値
NULLは、「値がまだ入っていない」「値が存在しない」「値が不明」といった状態を表現するための特別な概念です。
たとえば次のようなケースです
-
顧客の電話番号が未登録
-
退職日がまだ決まっていない
-
コメント欄が未入力
-
更新日時が未設定
-
売上金額が未計算
このようなとき、無理に0や空文字を入れるのではなく、NULLを使うことで「値がない」という状態を正しく表現できます。
NULLと空文字の違い
初心者が特に混乱しやすいのが、NULLと空文字の違いです。
NULL
値そのものが存在しません。
空文字 ''
長さ0の文字列です。
つまり、「値は存在しているが、中身が空の文字列」です。
この違いはとても重要です。
たとえば、次の2つは見た目が似ていても意味が異なります。
''
前者は「値がない」、後者は「空の文字列が入っている」という状態です。
例
CASE WHEN NULL IS NULL THEN 'NULLです' ELSE 'NULLではありません' END;
これはNULLとして扱われます。
一方で、空文字は文字列として扱われます。
CASE WHEN '' = '' THEN '空文字です' ELSE '空文字ではありません' END;
こちらは通常の比較が可能です。
なぜ = NULL では比較できないのか
SQL ServerでNULLを扱うとき、最初につまずきやすいのがこれです。
多くの初心者は次のように書いてしまいます。
FROM Users
WHERE Email = NULL;
しかし、この書き方ではNULLの行は取得できません。
なぜなら、NULLは「不明な値」なので、通常の等価比較 = では判定できないからです。
SQLでは、NULLとの比較結果はTRUEでもFALSEでもなく、**UNKNOWN(不明)**として扱われます。
そのため、NULLかどうかを判定したい場合は、必ず次のように書く必要があります。
FROM Users
WHERE Email IS NULL;
逆に、NULLではない値を取得したい場合は次のようにします。
FROM Users
WHERE Email IS NOT NULL;
NULLを判定する基本構文
NULLを扱うときに最も基本となるのは、次の2つの構文です。
IS NULL
列の値がNULLかどうかを判定します。
FROM Employees
WHERE PhoneNumber IS NULL;
このSQLは、電話番号が登録されていない社員を取得します。
IS NOT NULL
列の値がNULLではないかどうかを判定します。
FROM Employees
WHERE PhoneNumber IS NOT NULL;
このSQLは、電話番号が登録されている社員を取得します。
サンプルテーブルでNULLを確認してみる
ここでは具体例として、次のようなテーブルを考えます。
EmployeeID INT,
EmployeeName NVARCHAR(100),
Department NVARCHAR(100),
PhoneNumber NVARCHAR(20),
Bonus MONEY
);
データを入れてみます。
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の行だけ取得する
FROM Employees
WHERE PhoneNumber IS NULL;
このSQLでは、電話番号がNULLの社員だけが取得されます。
NULLではない行を取得する
FROM Employees
WHERE Bonus IS NOT NULL;
このSQLでは、賞与が設定されている社員だけが取得されます。
空文字も一緒に探したい場合
NULLだけではなく、空文字も未入力として扱いたいことがあります。
その場合は、次のように書きます。
FROM Employees
WHERE PhoneNumber IS NULL
OR PhoneNumber = '';
これで、NULLと空文字の両方を取得できます。
NULLを別の値に置き換える方法
実務では、NULLのままだと扱いにくいため、表示時に別の値へ置き換えたい場面がよくあります。
そのときに使われる代表的な関数が ISNULL と COALESCE です。
ISNULLの使い方
ISNULL は、指定した値がNULLだった場合に、代わりの値を返す関数です。
基本構文
例1: NULLを0に置き換える
EmployeeName,
ISNULL(Bonus, 0) AS BonusAmount
FROM Employees;
このSQLでは、BonusがNULLなら0を返します。
例2: NULLを文字列に置き換える
EmployeeName,
ISNULL(PhoneNumber, '未登録') AS Phone
FROM Employees;
このSQLでは、電話番号がNULLなら「未登録」と表示されます。
ISNULLのポイント
-
シンプルでわかりやすい
-
NULLを別の値に置き換える用途でよく使う
-
SQL Serverでよく使われる
-
戻り値の型に注意が必要
COALESCEの使い方
COALESCE もNULLを別の値に置き換えるために使われますが、複数の候補から最初のNULLではない値を返せる点が特徴です。
基本構文
左から順に見ていき、最初にNULLではない値を返します。
例1: BonusがNULLなら0を返す
EmployeeName,
COALESCE(Bonus, 0) AS BonusAmount
FROM Employees;
見た目としてはISNULLと似ています。
例2: 複数候補から最初の値を取得する
EmployeeName,
COALESCE(PhoneNumber, Department, '情報なし') AS ContactInfo
FROM Employees;
このSQLでは、次の順で値を判定します。
-
PhoneNumber
-
Department
-
どちらもNULLなら「情報なし」
このように、複数の列や候補の中から最初に使える値を返したいときに便利です。
ISNULLとCOALESCEの違い
初心者が悩みやすいポイントなので、ここで整理しておきます。
ISNULL
-
SQL Server独自の関数
-
引数は2つ
-
シンプルで使いやすい
-
単純なNULL置換に向いている
COALESCE
-
標準SQLに近い書き方
-
引数を複数指定できる
-
最初のNULLではない値を返せる
-
複数候補を扱うときに便利
どちらを使えばいいのか
単純に1つの値を置き換えたいだけなら、ISNULL で十分なことが多いです。
一方で、複数候補の中から使える値を順番に探したいなら COALESCE が向いています。
CASE式でNULLを扱う方法
NULLの扱いをもっと細かく制御したい場合は、CASE 式も便利です。
例: NULLならメッセージを表示する
EmployeeName,
CASE
WHEN Bonus IS NULL THEN '賞与なし'
ELSE '賞与あり'
END AS BonusStatus
FROM Employees;
このSQLでは、BonusがNULLなら「賞与なし」、そうでなければ「賞与あり」と表示します。
例: NULLと空文字をまとめて判定する
EmployeeName,
CASE
WHEN PhoneNumber IS NULL OR PhoneNumber = '' THEN '未登録'
ELSE PhoneNumber
END AS PhoneDisplay
FROM Employees;
表示ルールが複雑な場合は、ISNULLやCOALESCEよりCASE式のほうがわかりやすいこともあります。
WHERE句でNULLを扱うときの注意点
WHERE句でNULLを使うときは、普通の比較演算子では思ったように動かないことがあります。
誤った例
FROM Employees
WHERE Bonus <> NULL;
これでは正しく判定できません。
正しい例
FROM Employees
WHERE Bonus IS NOT NULL;
NULLを含む条件分岐に注意
たとえば、次のような条件を書くとします。
FROM Employees
WHERE Bonus > 10000;
この場合、BonusがNULLの行は条件判定できないため、結果に含まれません。
NULLは0として扱われるわけではないので注意が必要です。
ORDER BYでNULLを扱うとどうなるか
並び替えを行うとき、NULLの行がどこに来るかが気になることがあります。
FROM Employees
ORDER BY Bonus ASC;
このとき、NULLの並び位置はDBの評価ルールに影響されるため、意図的に制御したい場合は CASE を使うことがあります。
例: NULLを最後にしたい
FROM Employees
ORDER BY
CASE WHEN Bonus IS NULL THEN 1 ELSE 0 END,
Bonus ASC;
これにより、BonusがNULLの行を最後に回し、その後で数値順に並び替えられます。
集計関数でNULLはどう扱われるのか
NULLは集計でも非常に重要です。
特に COUNT、SUM、AVG の挙動は理解しておく必要があります。
COUNTでNULLを扱う場合
COUNT(*)
全行数を数えます。NULLがあっても関係ありません。
FROM Employees;
COUNT(列名)
指定した列でNULLではない行だけを数えます。
FROM Employees;
この場合、BonusがNULLの行はカウントされません。
違いの例
もしEmployeesに4行あって、そのうちBonusがNULLの行が2件なら、
-
COUNT(*)は 4 -
COUNT(Bonus)は 2
になります。
SUMでNULLを扱う場合
SUM はNULLを無視して合計します。
FROM Employees;
BonusがNULLの行は計算対象に含まれません。
NULLを0として扱いたい場合
FROM Employees;
通常はSUM自体がNULLを無視するので問題ないことが多いですが、計算ロジックを明示したい場合はこのように書くこともあります。
AVGでNULLを扱う場合
AVG もNULLを無視して平均を計算します。
FROM Employees;
NULLの行は除外されるため、「全員の平均」ではなく「Bonusが入っている人だけの平均」になります。
もしNULLを0として平均を計算したいなら、意図的に変換する必要があります。
FROM Employees;
ただし、これは意味が変わるので注意してください。
NULLを0とみなしてよいかどうかは業務ルールによります。
JOINでNULLを扱うときの注意点
JOINでもNULLは初心者がつまずきやすいポイントです。
たとえば、部署コードなどでテーブルを結合するとします。
FROM Employees e
LEFT JOIN Departments d
ON e.Department = d.DepartmentCode;
もし e.Department がNULLなら、通常は一致しないため、結合先の値は取得されません。
JOIN条件でNULL比較をしたい場合
NULL同士を一致とみなしたい特殊なケースでは、単純な = ではなく工夫が必要です。
たとえば、以下のように置き換えて比較することがあります。
FROM TableA a
JOIN TableB b
ON ISNULL(a.Code, '') = ISNULL(b.Code, '');
ただし、この方法は業務要件によっては意図しない一致を生むこともあるため、慎重に使う必要があります。
INSERTでNULLを入れる方法
NULLを明示的に登録したい場合は、INSERT文で NULL を指定します。
VALUES (5, '中村', '人事', NULL, NULL);
また、列がNULLを許可している場合は、その列を省略してINSERTすることもあります。
VALUES (6, '小林');
この場合、省略した列にデフォルト値がなければNULLが入ります。
UPDATEでNULLを設定する方法
既存データをNULLにしたい場合は、UPDATE文で NULL を代入します。
SET PhoneNumber = NULL
WHERE EmployeeID = 1;
これで電話番号を未設定状態に戻せます。
NULLを許可する列と許可しない列
テーブル作成時には、列ごとにNULLを許可するかどうかを決められます。
NULLを許可する例
CustomerID INT NOT NULL,
CustomerName NVARCHAR(100) NOT NULL,
Email NVARCHAR(200) NULL
);
NULLを許可しない例
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のまま保持し、画面表示や帳票出力時だけ ISNULL や COALESCE で変換するのが一般的です。
4. 集計時はNULLをどう解釈するか決める
NULLを0として扱うのか、未計上として除外するのかで結果が大きく変わるため、業務ルールの確認が必要です。
初心者がやりがちなNULLのミス
NULLを扱うとき、初心者がよくやってしまうミスがあります。
= NULL と書いてしまう
これは非常によくあるミスです。
必ず IS NULL を使います。
空文字とNULLを同じだと思う
両者は別物です。
検索や集計結果が変わるので注意が必要です。
SUMやAVGがNULLを無視することを知らない
集計結果が想定と違う原因になりやすいです。
なんでもISNULLで置き換える
便利ですが、業務上「NULLのまま扱うべきか」を考えずに変換すると、意味が変わってしまうことがあります。
NULLを許可する設計にしすぎる
全部の列をNULL可にしてしまうと、データ品質が悪化しやすくなります。
実践例:NULLを含むデータを見やすく表示するSQL
最後に、実務でよくある「NULLをユーザーにわかりやすく表示したい」例を紹介します。
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 を使います。
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の置換には
ISNULLやCOALESCEを使う -
集計関数ではNULLが無視されることが多い
-
設計時にNULLを許可するかどうかを明確にする
NULLはSQLの基本でありながら、実務では非常に重要なテーマです。
なんとなく扱うのではなく、意味を理解したうえで使い分けることで、バグや誤集計を大きく減らせます。
SQL Server初心者の方は、まず IS NULL、IS NOT NULL、ISNULL、COALESCE の4つをしっかり使えるようになるところから始めるのがおすすめです。
Si quieres conocer otros artículos parecidos a SQL ServerでNULLを扱う方法|初心者向けにわかりやすく解説 puedes visitar la categoría Puroguramingu.
