今日はなにの日。

気になったこと勉強になったことのメモ。

今日は、データベースでのNullの基礎知識の日。

とある日

データベースの勉強をしていて、切っては切り離せないNullについてもっと知りたいと思い。

Nullについて、調べまとめてみた。

ただ、Nullについての全てを調べようとすると範囲が広すぎるので今回はNullの比較について調べようと思います。

そもそもNullとは

Wikipedia1では下記のようになっている。

Null(ヌル、ナル)は、何もない、という意味で、プログラミング言語などコンピュータ関係では、「何も示さないもの」を表すのに使われる。

自分は、Nullをヌルと呼んでいます。自分の周りもヌルといいます。ナルと呼ぶ人にはあったことがないですね。

ちなみに、英単語にもNullがあり、意味は(法律上)無効の、価値のない、ゼロの、零のという感じですね。

自分としては、コンピュータ関係の意味と英単語の意味は少しニュアンスが違う気がします。

ここで、定義を改めたいと思います。

この記事にて、Nullとはデータベースにて使用されるNullについてのあれこれを記述していきます。

この記事のNullについて記述していることは、データベース以外のNullとは振る舞いが異なる可能性があるのでご了承ください。

Null比較

ここからは、データベース上でのNullの比較について調べていこうと思います。

データベースでは、比較演算子を使用して数値を比較することができます。

比較演算子とは=, >, <とかですね。

例えば。

数値同士の比較

mysql> select 2 = 2;
+-------+
| 2 = 2 |
+-------+
|     1 |
+-------+
1 row in set (0.00 sec)

mysql> select 2 = 1;
+-------+
| 2 = 1 |
+-------+
|     0 |
+-------+
1 row in set (0.00 sec)

0:だとFalseを表し、1:はTrueを表します。

数値同士だとこうなりますが、Null同士の比較はこうはいけません。

Null同士の比較

mysql> select null = null;
+-------------+
| null = null |
+-------------+
|        NULL |
+-------------+
1 row in set (0.00 sec)

mysql> select null = 1;
+----------+
| null = 1 |
+----------+
|     NULL |
+----------+
1 row in set (0.00 sec)

Nullの比較には=,>,<を使用することはできない。

理由は、Nullは値ではないからである。

そして、SQLが2値論理ではなく3値論理を採用しているからである。

3値論理

「紙袋Aには紙袋Bよりも多くのツナ缶が入っている」

TrueかFalseか?

「そんなのわからない」となるだろう。そこでわからないを表すために登場するのが3値論理である。

Nullを比較するにはis NULLを使用する。

ベンダーによるNullの違い

Oracle12c

SQL> select null || '1' from dual; 

N
-
1

SQL> select concat( null,'1') from dual; 

C
-
1

MySQL8.0

mysql> select concat(null,'a');
+------------------+
| concat(null,'a') |
+------------------+
| NULL             |
+------------------+
1 row in set (0.00 sec)

mysql> select null || 'a';
+-------------+
| null || 'a' |
+-------------+
|        NULL |
+-------------+
1 row in set, 2 warnings (0.00 sec)

OracleMySQLでは、文字結合をした際に結果が変わってしまう。

これは、ベンダーによるNullの扱い方が違うから起こることである。

まとめ

Nullはたびたび意図しない振る舞いをする。

Nullをなくすことはできないだろう。

だが、少なくすることはできる。そういったテーブル設計やSQLの作成も学んでいきたい。

今回は、Nullに関する基礎について記述したが次回はもっと論理に対する勉強を勧めていきたいと思う。