SQL ServerでのNULLの扱いを徹底解説:基本から応用まで

SQL Serverでデータを扱う際に必ず出てくるのが「NULL」です。

NULLは「値が存在しない」ことを示す特殊な概念ですが、その扱いを間違えると意図しない結果を引き起こすことがあります。

本記事では、SQL ServerにおけるNULLの基本的な概念から、NULLを正しく扱うための応用テクニックまでを詳しく解説します。また、学習内容を確認するための演習問題も用意しました。


NULLとは何か?

NULLは「値が存在しない」状態を示します。これは、ゼロや空文字列とは異なり、「何もない」ことを意味します。

  • ゼロ: 数値が「0」であることを意味する具体的な値。
  • 空文字列 (”): 長さが0の文字列が存在することを意味する。
  • NULL: 値そのものが存在しないことを示す。

例えば、以下の例を考えてみましょう。

-- 数値カラムにNULLを挿入
INSERT INTO SampleTable (ValueColumn) VALUES (NULL);

この場合、ValueColumnには「値が存在しない」という情報が記録されます。


NULLの比較に関する注意点

NULLは比較演算子(=や!=など)では正常に評価されません。以下のSQLを見てみましょう。

SELECT * 
FROM SampleTable
WHERE ValueColumn = NULL;

このクエリは正しく動作しません。なぜなら、NULL同士の比較は常に「不明(UNKNOWN)」と評価されるからです。

解決策: IS NULL または IS NOT NULL

NULLを比較する際には、「IS NULL」や「IS NOT NULL」を使用します。

-- NULLの行を取得
SELECT * 
FROM SampleTable
WHERE ValueColumn IS NULL;

NULLが計算や集計に与える影響

NULLは計算や集計関数で特殊な挙動をします。

計算時のNULL

計算式にNULLが含まれると、結果もNULLになります。

SELECT ValueColumn + 10 AS Result
FROM SampleTable;
-- 結果: NULL + 10 = NULL

集計関数でのNULL

多くの集計関数(SUM, AVG, COUNTなど)は、NULLを無視します。

-- NULLは無視される
SELECT SUM(ValueColumn) AS Total
FROM SampleTable;

ただし、COUNT(*)はNULLを含む全行をカウントします。


NULLを扱う際の関数

NULLの扱いを簡単にするために、SQL Serverにはいくつかの便利な関数があります。

ISNULL関数

ISNULLは、NULLの代わりにデフォルト値を設定できます。

SELECT ISNULL(ValueColumn, 0) AS ValueOrDefault
FROM SampleTable;

COALESCE関数

COALESCEは複数の値を指定し、最初にNULLでない値を返します。

SELECT COALESCE(ValueColumn, DefaultColumn, 0) AS FirstNonNull
FROM SampleTable;

実践例: NULLとJOINの挙動

NULLはテーブルの結合(JOIN)においても影響を与えます。以下の例を見てみましょう。

-- サンプルデータ
CREATE TABLE A (ID INT, Name NVARCHAR(50));
CREATE TABLE B (ID INT, Description NVARCHAR(50));

INSERT INTO A (ID, Name) VALUES (1, 'Alice'), (2, 'Bob'), (NULL, 'Charlie');
INSERT INTO B (ID, Description) VALUES (1, 'Engineer'), (NULL, 'Unknown');

-- JOINの例
SELECT A.Name, B.Description
FROM A
LEFT JOIN B ON A.ID = B.ID;

この場合、A.IDとB.IDが両方NULLであっても結合されません。NULL同士は等しくないと評価されるためです。


演習問題

以下の問題を解いて、NULLに関する理解を深めましょう。

基本問題

次のSQLを実行した結果はどうなるでしょう?

CREATE TABLE TestTable (ValueColumn INT);
INSERT INTO TestTable (ValueColumn) VALUES (NULL), (10), (20);

-- 問題1: NULLを含む行を取得
SELECT * 
FROM TestTable
WHERE ValueColumn IS NULL;

-- 問題2: NULLを0に置き換えて全行を取得
SELECT ISNULL(ValueColumn, 0) AS ValueOrDefault
FROM TestTable;

応用問題

以下のサンプルデータを基に、NULLを正しく扱うクエリを作成してください。

-- サンプルデータ
CREATE TABLE Orders (OrderID INT, Amount INT);
INSERT INTO Orders (OrderID, Amount) VALUES (1, 100), (2, NULL), (3, 200);

-- 問題: NULLを除外して総売上(合計金額)を計算してください

解答例

基本問題の解答

問題1
-- NULLを含む行を取得
SELECT * 
FROM TestTable
WHERE ValueColumn IS NULL;

-- 結果:
-- | ValueColumn |
-- |-------------|
-- | NULL        |
問題2
-- NULLを0に置き換えて全行を取得
SELECT ISNULL(ValueColumn, 0) AS ValueOrDefault
FROM TestTable;

-- 結果:
-- | ValueOrDefault |
-- |----------------|
-- | 0              |
-- | 10             |
-- | 20             |

応用問題の解答

-- NULLを除外して総売上を計算
SELECT SUM(Amount) AS TotalSales
FROM Orders
WHERE Amount IS NOT NULL;

-- 結果:
-- | TotalSales |
-- |------------|
-- | 300        |

まとめ

SQL ServerでのNULLの扱いはデータベース操作において非常に重要なポイントです。

NULLの概念を正しく理解し、適切な関数や演算子を用いることで、意図したデータ処理を実現できます。

本記事を参考に、ぜひ実務で役立ててください!