【SQL】 NOT NULL は NULL

【SQL】 NOT NULL は NULL

こんにちは。小野です。

今回はSQLにおけるNULLの扱いについてです。

タイトルの通り、SQLではNOT NULLはNULLを返します。

ちょっと何言ってるかわからないです。
こんな感じのNULLの扱いに頭を悩ませることがあったのでまとめておきます。

NULLと比較

誤: column = NULL はNULLの値を持つ行を返す。

正: SQLでは、他の値との直接比較は常にNULLを返します。

なので、column = NULL は常にFALSEと評価され、結果は返されません。

SELECT * FROM table WHERE column = NULL; -- NULL

NULLをチェックするには column IS NULL を使用します。

SELECT * FROM table WHERE column IS NULL;

NULLと算術演算

誤: NULLを含む算術演算は0として扱われる。

正: NULLを含む算術演算は常にNULLを返します。

SELECT column1 + 10 FROM table; -- column1がNULLの場合、結果もNULL

NULLを0として扱うにはCOALESCE関数を使います。

SELECT COALESCE(column1, 0) + 10 FROM table; -- column1がNULLの場合、0として扱う

NULLと集約関数

誤: COUNT(column) はNULLを含む行もカウントする。

正: COUNT(column) はNULLでない行のみをカウントします。

COUNT(*)は全行をカウントします。

-- 5行のうち、2行がNULLの場合
SELECT COUNT(column) FROM table; -- 3
SELECT COUNT(*) FROM table; -- 5

💡 集約関数(SUM, AVG, COUNTなど)はNULLを無視します。

NULLと論理演算

誤: NOT NULLTRUE を返す

正: NOT NULL は常にNULLを返します。

SELECT * FROM table WHERE NOT column; -- NULL

代わりにIS NOT NULL を使用します。

SELECT * FROM table WHERE column IS NOT NULL;

NULLと文字列連結

誤: 文字列とNULLを連結すると、文字列が返される。

正: 文字列とNULLを連結すると、結果もNULLになります。

SELECT 'Name: ' || name FROM table; -- nameがNULLの場合、結果もNULL

NULLを含む可能性がある列を連結するには、COALESCE関数やCONCAT_WS関数を使います。

SELECT 'Name: ' || COALESCE(name, 'Unknown') FROM table; -- nameがNULLの場合、'Unknown'として扱う

NULLと条件式

誤: CASE WHEN でNULLを評価する際、= を使用できる。

正: column = NULL は常にFALSEと評価されます。

SELECT CASE WHEN column = NULL THEN 'Null Value' ELSE 'Non-Null Value' END FROM table; -- column = NULLは常にFALSE

CASE WHEN でNULLを評価する場合、IS NULL を使います。

SELECT CASE WHEN column IS NULL THEN 'Null Value' ELSE 'Non-Null Value' END FROM table;

NULLとIN演算子

誤: INリストにNULLが含まれている場合、NULLも条件に一致する。

正: INリストにNULLが含まれていても、NULL値の行は選択されません。

SELECT * FROM table WHERE column IN (1, 3, NULL); -- NULL値の行を返さない

NULLも含める場合、IS NULL を使います。

SELECT * FROM table WHERE column IN (1, 3) OR column IS NULL; -- 1, 3, またはNULLの行を返す

※ NULL IN

NULLと具体的な値との比較は常にNULLを返します。

SELECT * FROM table WHERE NULL IN (1, 2); -- NULL

まとめ

以上のように、NULLの扱いはデータの整合性とクエリの正確性に大きく影響します。

とくにSQLのNULLはなんだか独特な振る舞いなので、適切に扱いを知っておくことが重要です。