【SQL】NULLを扱うときの注意点~NULLを含む演算~

NULLについては、みなさんご存じかと思います。
新人のときにNULLと空文字、0の違いについて習ったかと思いますが、、、

NULLは値が何も存在しない状態です。
レコードを作成する時に値を何も指定しなかった列はNULLになります。
空文字は''、0は0を明示的に指定する必要があります。

SQLで演算結果を取得した場合に、予期せぬ値が取得されることがあります。
そういった場合、意図せずNULL値を含んだ計算を行っていることが考えられますので、注意しましょう!というお話です。

目次

NULLの演算

Syainテーブル

社員番号 日給1 日給2
1001 1000 NULL
1002 800 1000
1003 500 800
SELECT 日給1 + 日給2
  FROM Syain

SELECT結果:NULL

注意1)NULL値に対して+,* . / 等の各種演算を行った場合、計算できないので結果はNULLになります。

SELECT AVG(日給2)
  FROM Syain

SELECT結果:900 ※NULLは無視され、(1000+800)÷2で計算されます

注意2)平均値を求める集計関数(AVG)、SUM、MAX、MINなどを使用した時はNULLのレコードは無視されます。

--①
SELECT COUNT(*)
  FROM Syain
--②
SELECT COUNT(日給2)
  FROM Syain

①SELECT結果:3

②SELECT結果:2

注意3)COUNT(*)は、NULLも含まれますが、COUNT(日給2)はNULLを無視します。

対策:NULLの可能性がある項目を計算に使用したい場合は、ISNULL関数を使って0に置換しておくと良い。

ISNULL()した結果をAVGした場合は、NULLは無視されず、置換した値を集計していることになるのでカウント対象になります。

SELECT ISNULL(日給2,0) 
  FROM Syain

(参考)NULLの検索

SELECT *
  FROM Syain
 WHERE 生年月日 IS NULL
SELECT *
  FROM Syain
 WHERE 生年月日 IS NOT NULL

注意)WHERE 生年月日 = NULL や WHERE 生年月日 IN NULL などの句にNULLを指定することはできません。

今日はここまで。