【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 NULL
は TRUE
を返す
正: 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はなんだか独特な振る舞いなので、適切に扱いを知っておくことが重要です。