SQLを勉強する入門書などでは、基本的な構文を中心的に解説しているものが多いでしょうから、NULLを勉強する必要性を強いられる場面は少ないのではないでしょうか。
当サイトでは、非エンジニアのビジネスパーソンが、SQLを業務で利用できるレベルになるための解説を目的としているため、業務利用時に必須となるNULLの説明には力を入れていきます。
プログラミングでも登場する概念なので、SQLを入口として理解を進めると、プログラミングを勉強することになった時に役立ちます。
NULLとは「何も示さないもの」を指す
まずはWikipediaの説明を見てみましょう。
Null(ヌル、ナル)は、何もない、という意味で、プログラミング言語などコンピュータ関係では、「何も示さないもの」を表すのに使われる。
https://ja.wikipedia.org/wiki/Null
「何もない」との言葉が使われていますが、「0」(ゼロ)や「」(空文字)とは異なります。
「0」は「0」という数値を示しており、「」(空文字)は文字列長0の文字を示しています。
いずれもNULLとは別物扱いで、「何も示さないもの」というわけではありません。
BigQueryでは「未定の値」と理解しておけばOK
「何も示さないもの」と理解しておけば正しいのですが、それだと初心者が直感的に理解するのは難しいのではないでしょうか。
そこで、「どの値を指すのか確定していないことを示す値」、「未定の値」と理解しておく勉強法をおすすめします。
SELECT 10 + CAST(NULL AS INT64) AS sample -- 算出結果はNULLになる
このクエリは10にNULLを足した結果を出力させるものですが、算出結果はNULLになります。
これを「未定の値」と置き換えてみましょう。
10に未定の値を足した結果、未定の値になります。
未定の値が1だったら11になるし、2だったら12になる、結果も定まらないわけなので未定となります。
Wikipediaにも難しい言葉で解説されているので、引用しておきますね。
具体的にはNULLには、未知・不明 (Unknown) の場合と適用不能・非存在 (Not Applicable, Inapplicable) の場合がある。
https://ja.wikipedia.org/wiki/Null
ただし別のSQLでは違う計算結果になることもある
使う環境によって計算結果が変わります。
これもWikipediaの例を流用しましょう。
Oracleは空文字列とNULLを区別しないため、NULL あるいは空文字列を含む演算で非標準な結果となることがある。
例えば、文字列と NULL を連結すると本来は NULL になるが、Oracleでは文字列の値を変えない(ただし NULL 同士の連結は NULL になる)。
https://ja.wikipedia.org/wiki/Null
SELECT 'A' || CAST(NULL AS STRING) AS sample -- 算出結果はNULLになる
BigQueryではNULLになるが、Oracleでは「A」になるとのこと。
何を使うかによって結果が変わってしまうことは覚えておきましょう。
どの条件でどのように結果が変わるかをすべて把握することは難しいので、初心者はスルーしましょう。
SAFE_CASTを使った時などのエラー値の代わりにも使われる
データ型の変換の時に登場したSAFE_CASTですが、エラーになるようであれば、代わりにNULLが出力されます。
データ型を理解するための記事を設置予定
元々NULLだったものと区別する必要が無い時に使いましょう。
初心者の内は、SAFE_CASTを使わない縛りの中で勉強を進めることをおすすめします。
JOIN句を習得する時にも登場する
JOIN句を使うと、複数のテーブルを統合させることができるのですが、その時、結合できないケースでNULLが登場します。
JOIN句を習得するための記事を設置予定
JOIN句を習得する時には、NULLの理解を深めておきましょう。
NULLはどのデータ型でも登場する
前述のサンプルクエリでも登場していますが、INT64のNULLもあれば、STRINGのNULLも存在します。
「未定の値」なので、そのデータ型でのどの値を取るのか決まっていないためです。
CASTを使うことでサンプルクエリで指定のデータ型に変換できます。
普段のクエリで使うことは稀ですが、サンプルとしてお見せする場面では登場するので、驚かずに読み解いてください。
NULLだったら困る時にはIFNULL関数を使う
SQLを書いていると、NULLだったら困る場面に何度も遭遇するでしょう。
IFNULLという関数を使うと、NULLじゃなければそのままの値、NULLだったらこの値、といった条件分岐で値算出してくれます。
SELECT
IFNULL(CAST(NULL AS INT64), 0) AS sample_int,
IFNULL(CAST(NULL AS STRING), "") AS sample_string,
IFNULL(CAST(NULL AS BOOL), FALSE) AS sample_bool,
IFNULL(CAST(NULL AS DATE), DATE("1970-01-01")) AS sample_date
よく使う関数の一つとして覚えておきましょう。
よく使う関数を紹介する記事を設置予定
BOOL型のNULLの使い方はマスターしておこう
BOOL型を使っていると、TRUEかFALSEの2種類の値しかありえないと思い込み、NULLになっている可能性を見落としてしまうことがあります。
見落としてしまうと、本来抽出したかったデータが抽出できなかったり、抽出レコードが0件になってしまったりなど、想定していない挙動(不具合)が発生してしまいます。
よくある不具合(NULL)を紹介する記事を設置予定
リンク先もご一読いただくことで、NULLの取り扱いに習熟していただきたいところですが、これを理解するには「条件式」や「WHERE句」の知識が必要になります。
まだ習得されていない場合は、先に条件式をマスターしましょう。
集計する時やテーブル定義書を読み書きする時にもNULLの話は登場する
SQLを取り扱う上でNULLの理解は大事で、前述の他にも、集計関数の中でもCOUNT関数を使う時、テーブル定義書を読み書きする時にも登場します。
SQL初心者にとっては、勉強するのはまだ先になりますが、繰り返し登場するものと覚えておきましょう。
GROUP BY句を習得するための記事を設置予定
よく使う集計関数を紹介する記事を設置予定
振り返り
お疲れさまでした。
初めてNULLを知った方にとっては新鮮な知識だったのではないでしょうか。
初心者の方が順番に勉強しているのであれば、データ型を勉強しての派生としてNULLを理解して、次はBOOL型を勉強しての派生として条件式を勉強するのが良いのではないかと思います。
条件式を理解するための記事を設置予定
ぜひこちらもご一読ください。