NULLとは
「値が存在しない」または「値が不明」ということを示す。
値ではないため値のように比較できない。
空集合(要素が0個の集合)ではなく、存在しない集合と見なされる。
リレーショナルモデルに反するNULL
リレーショナルモデルは閉世界仮説(真であると判明しないものは全て偽であると仮定すること)に基づいており、NULLはこれに反する。
リレーショナルモデルでは2値論理が元となっているため、真と偽以外が存在する3値論理は受け入れがたい。
NULLの影響
- NULLは演算しても文字列操作をしてもNULL
- 意図しないSELECT結果を得る可能性
- NULLの扱いをどう解釈するかによってクエリが変わる
- 3値論理(TRUE, FALSE, Unknown)をもたらす
- オプティマイザへの悪影響
- NULLが存在するとオプティマイザの計算に影響する
- 最適なパフォーマンスを発揮するクエリへの書き換えや、クエリのコスト見積もりに悪影響する
NULLの対策
- テーブル正規化
- 正規化を進めることでカラムをNOT NULLとする
- NOT NULLを定義しつつも、NULLと同義になるようなデフォルト値を用いることは避ける
- COALESCE関数の使用
- 指定したカラムがNULLのときのデフォルト値を設定できる関数
- IFNULLもあるが、IFNULLはSQL標準ではない
- SQLの評価結果によりNULLになってしまうパターン(ex. SUMやAVGなどの集計関数の実行結果やOUTER JOINの結果、NULLIFの評価結果など)で有効に使える
空文字とNULL
空文字は長さが0で、存在する文字列であるの対し、NULLは存在しない集合であり、両者は区別されるものである。
NULLを許容するケース
リレーショナルモデルに合わないデータを扱う場合は許容しても良いと考えられる。
参考