skillup

技術ブログ

Database

NULLについて

投稿日:

「達人に学ぶSQL徹底指南書」を読み進めていきましたがNULLについていろいろ書いてあるのでメモリます。

NULLには未知と適用不能の2パターンがある

初めて知りましたが、NULLにも未知と適用不能の2パターンがあるようです。

  • 未知・・今はわからないけど、条件がそろえば知ることができる
  • 適用不能・・どう頑張ってもわからないもの

ただ実務上ではこの2つはほぼ同一に考えられているようですね。

= NULL が使えず IS NULLと書かなくてはいけない理由

要点をまとめると下記のようになるでしょうか。

  • NULLは値や変数ではなく、NULLというのはそこに値がないことを示す視覚的なマークのようなもの
  • またプログラミング言語でいうNULLとSQLのNULLとは全く別物
  • IS NULLというのはISとNULLの組み合わせよりはこれ1つで状態を表している
  • ブーリアンはtrue,false以外にもunknownという状態が存在する。

サンプルパターン
a=2,b=5,c=NULLだと仮定
a<b AND b >c unknown
a>b OR b<c  unknown
a<b OR b<c  true
NOT ( b<>c)  unknown

排中律が存在しない

name,ageだけのテーブルがあり、ある人物のageがNULLとすると、下記SQLでは選択できない

例えば上記のSQLの場合、人間の感覚でいうとすべての人は20歳以上もしくは20歳未満ですのですべてが該当しそうですが、NULLの場合はわからないとなって出てこなくなります。

CASE式とNULL

上記のSQLでは×を返すことがありません。col_1 = NULLという評価をするためです。この場合、NULLを判定したい場合は、下記のように書きます。

NOT INとNOT EXISTSは同値ではない

Class_A

name age city
ヤマダ 23 神奈川
タロウ 22 千葉

Class_B

name age city
サイトウ 22 東京
ワタナベ 東京
キムラ 23 千葉

上記のようなテーブルがあり Class_Bの東京在住の生徒と年齢が一致しないAクラスの生徒を選択するクエリを書くとします。期待する結果としては「ヤマダ」たとれればOKです。

これですと実は1人も選択されません。(もちろん

であれば22が引っかかります。

これはNOT~が具体的にはunknown(含まれているか、含まれていないかがわからない)を返すから判定できない、となってしまうのです。ちなみにNOT EXISTSにかえると、意図した検索結果(ヤマダ)が帰ってきます。(※EXISTSはtrueかfalseを必ず返すため。)

詳しくは「達人に学ぶSQL徹底指南書」を読んでみましょう。

それ以外でも集約関数などでNULLが悪さをすることがあり、NULLは様々な誤動作をすることがあります。

対策としてはNULL自体を使わずにNOT NULLをなるべく使うというのが正しいテーブルの作り方になります。

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

sourceコマンドに関して(Linuxサーバー&MySQL)

Linux上ではコマンドをテキストファイルに記述して、

と入力すると命令を実行してくれます。 シェルスクリプトよりもお手軽に実行できる …

no image

SQL基礎 条件式はunionよりもcaseで

複雑な条件式があったときにcase式を使うことでパフォーマンスを向上させることができます。 ※一般にunionを使うよりも高速なことが多い。 例1 ある条件により別の列を使いたいとき、 [crayon …

no image

サブクエリ 移動平均など

前回の応用編です。 日付、入出金、残高はできましたが、ここからさらに、現在のレコードから3行以内(3行あれば3行、なければそれ以内でできるだけ)のレコードの合計値を出す計算を考えます。 結果だけ先に書 …

no image

Postgresの基礎(主にMySQLとの違いなど)

えー来月(2020年3月)より、postgresを使うかもしれないので、ちょっと復習を。 Contents1 以前のリンク2 基本コマンド比較2.1 超頻出系3 テーブル比較4 SELECT文5 do …

no image

Firebaseについて

前回Lambdaに少し触れましたが、2019年6月現在、サーバーレスなアプリというものが活況(?)のようです。 大規模なアプリというと Webサーバー+RDB+サーバーサイドプログラミング言語 が必須 …