データ分析をしていると、データがはいっていないカラムに遭遇することがあります。
例えば、Twitterはプロフィール画像の設定が任意です。アクティブに運用している人は設定していますが、タイムラインを見る専門の人は設定していないことも多いでしょう。
この場合、プロフィール画像を設定していない人は、プロフィール画像のデータが空の状態ということになります。
これを、データベースではデータの値がNULL(ヌル)の状態にあると言います。
本記事では、NULLの解説から始まり、NULLデータを指定するIS NULL演算子、IS NOT NULL演算子の使い方について詳しく解説していきます。
目次
そもそもNULLとは?
NULLはプログラミング言語やデータベースで使われる概念で、データが何もないことを表します。読み方は「ヌル」もしくは「ナル」です。私は「ヌル」と読んでいます。
例えば、下記のようなテーブルがあったとします。
| id | name | age | created_at |
|---|---|---|---|
| 1 | 山田 | 25 | 2021-01-01 |
| 2 | 鈴木 | 36 | 2020-08-21 |
| 3 | 佐藤 | 28 | 2021-04-09 |
| 4 | 小宮山 | 49 | 2020-12-24 |
現在は全てのカラムにデータが存在していますが、冒頭でも話したようにデータが保存されない場合もあります。このデータがない場合に、データベースのカラムには初期値としてNULLが保存されるのです。
文字が保存されるカラムであっても数値が保存されるカラムであっても、データが何も入っていない場合にはNULLが自動で割り当てられます。
仮に、IDが3のnameカラムにデータが存在しない場合、下記のようになります。
| id | name | age | created_at |
|---|---|---|---|
| 1 | 山田 | 25 | 2021-01-01 |
| 2 | 鈴木 | 36 | 2020-08-21 |
| 3 | NULL | 28 | 2021-04-09 |
| 4 | 小宮山 | 49 | 2020-12-24 |
IDが3のnameカラムには「データが何もない」という意味を持つNULLが自動で保存されます。
NULLは0(ゼロ)ではない
データがないのであれば、0でいいのでは?という声が聞こえてきそうですが、明確に異なります。
0はデータの種類が数値です。よって、0という数値データが保存されているということになるのです。データが存在しないことを示すNULLとは全くもって別物です。
NULLは' '(空の文字)ではない
同じように、空の文字も明確にNULLとは異なります。
' 'はあくまで文字のデータです。よって、' 'という文字データが保存されていることになります。データが存在しないという意味のNULLとは別物です。
データベースにおいてNULLの検索は特殊
ここまで説明してきたとおり、データベースにおいてNULLとそれ以外のデータ(文字や数値など)は区別して扱われます。よって、文字や数値データと同じように検索をすることができません。
NULLが入ったデータを検索しようと思うと、真っ先に思い浮かぶのがカラム名 = NULLだと思います。しかし、これではNULLを含んだ項目を検索することはできません。

また、先ほどの例ではIDが3のnameカラムはNULLになっていました。そこで、例えばname != '山田'と検索すればNULLが入ったデータも取得できるように思うかもしれません。
しかし、これでもNULLは検索に引っ掛からないのです。

検索結果は下記のようになります。
| id | name | age | created_at |
|---|---|---|---|
| 2 | 鈴木 | 36 | 2020-08-21 |
| 4 | 小宮山 | 49 | 2020-12-24 |
NULLが保存されているレコードは取得できません。
NULLが入った項目を検索する場合には、「IS NULL演算子」を使う必要があります。では、次からはIS NULL演算子について詳しく解説していきます。
IS NULL演算子
IS NULL演算子は指定したカラムがNULLであるデータを取得します。主に、WHERE句と一緒に使われます。
基本構文
SELECT カラム名
FROM テーブル名
WHERE カラム名 IS NULLサンプルデータ(usersテーブル)
| id | name | age | address |
|---|---|---|---|
| 1 | 山田 | 25 | 東京都 |
| 2 | 鈴木 | 38 | NULL |
| 3 | 佐藤 | 28 | 大阪府 |
| 4 | 小宮山 | 47 | NULL |
| 5 | 武田 | 17 | NULL |
検索クエリ
usersテーブルのaddressカラムがNULLであるレコードを取得する
SELECT *
FROM users
WHERE address IS NULL実行結果
| id | name | age | address |
|---|---|---|---|
| 2 | 鈴木 | 38 | NULL |
| 4 | 小宮山 | 47 | NULL |
| 5 | 武田 | 17 | NULL |
addressにNULLが保存されているレコードのみ取得できました。
IS NOT NULL演算子
IS NOT NULL演算子はIS NULLの否定形で、指定したカラムがNULLではないデータを取得します。
基本構文
SELECT カラム名
FROM テーブル名
WHERE カラム名 IS NOT NULL検索クエリ
usersテーブルのaddressカラムにデータが保存されているレコードを取得する
SELECT *
FROM users
WHERE address IS NOT NULL実行結果
| id | name | age | address |
|---|---|---|---|
| 1 | 山田 | 25 | 東京都 |
| 3 | 佐藤 | 28 | 大阪府 |
addressがNULLではないレコードのみ取得できました。
内容のまとめ
- NULLはデータが何もないことを意味する
- データの種類に関わらず、データの初期値としてNULLが保存される
- NULLは
0(ゼロ)でも' '(空文字)とも異なる - NULLの検索には比較演算子を用いることができない
- NULLのデータを検索するためにはIS NULL演算子を使う
- NULLではないデータを検索するためにはIS NOT NULL演算子を使う

