プログラムでnullと聞くと、「何もない(空でもなく存在しない)」という意味を連想すると思いますが、nullはこのほかにも演算子や関数でも使われています。
またnullは多くのプログラマーが嵌ってしまうややこしい用語としても有名です。
そこで今回はこの「null」そのものの作用と今回のテーマでもある「SQLにおけるnot null」について解説してみたいと思います。
nullは使い方によって意味が変わってくる用語なので、この記事を最後まで読んで理解できるようしっかりと学習しましょう。
nullとは
nullは「ヌル」と読みますが、nullはそもそも理論として言葉です。
よってプログラムでも大抵は「nullである」という使い方が正しくなります。
データベースには文字列型(varcher, text)、数値型(int)、日付型(date)、論理値型(boolean)など様々な型が存在しますが、これらのデータ型は全てnullがデフォルトとなっています。
少しややこしいのでもうちょっと別の言い方をすると、nullは全てのデータ型に存在する「中身が存在しない」場合に使われる用語だといえます。
中身が存在しないとは空という意味ではありません。
広義的に理解しようとすると、空は「何もない」という意味となりますが、プログラムの世界では空はEmptyであり、これは「空である」というデータが存在することになります。
nullを理解するにはまず「null ≠ Empty」だということを頭に叩き込んでおいてください。
データベースでのnullの存在
先ほどnullの基本的な部分については説明しましたが、データベースでのnullの扱いには注意が必要となります。
というのも、データベースではnullとそれ以外の値で区別されていると同時に、検索対象としては特殊な扱いを受けるように設計されているからです。
例えば、”word”という項目名があったとします。
全件検索で「word != ‘検索値’」としてもnull値の入ったレコードは検索にヒットしません。
また同じく、「word = null」としても検索できません。
実際にコードで試してみた方が速いと思いますので、もし今の説明で理解できないという方は実際に次のコードを記述して実行してみてください。
簡単な解説として、データベース内に”sample_table”というテーブルを作り、そのテーブルには「id」「name」「birth」という3つの項目を作成しています。
ここにいくつかレコードを挿入してありますが、これらのレコードのうちbirthには2つほどnull値を指定しています。
そしてこのテーブルからSELECTを使って全てnullを検索した結果を表示させるコードとなっています。
MariaDB [sample]> SELECT * FROM sample_table; +----+---------+------------+ | id | name | birth | +----+---------+------------+ | 1 | arex | 1980-04-13 | | 2 | Jon | NULL | | 3 | Jackson | NULL | | 4 | Noah | 1986-04-23 | +----+---------+------------+ 4 rows in set (0.000 sec) MariaDB [sample]> SELECT * FROM sample_table WHERE birth = null; Empty set (0.001 sec) MariaDB [laravel]> SELECT * FROM sample_table WHERE birth != '1980-04-13'; +----+------+------------+ | id | name | birth | +----+------+------------+ | 4 | Noah | 1986-04-23 | +----+------+------------+ 1 row in set (0.000 sec) MariaDB [sample]> SELECT * FROM sample_table WHERE birth is null; +----+---------+-------+ | id | name | birth | +----+---------+-------+ | 2 | Jon | NULL | | 3 | Jackson | NULL | +----+---------+-------+ 2 rows in set (0.000 sec) MariaDB [sample]> SELECT * FROM sample_table WHERE birth is not null; +----+------+------------+ | id | name | birth | +----+------+------------+ | 1 | arex | 1980-04-13 | | 4 | Noah | 1986-04-23 | +----+------+------------+ 2 rows in set (0.002 sec)
見ていただければ一目瞭然だと思いますが、「SELECT * FROM sample_table WHERE birth = null;」「SELECT * FROM sample_table WHERE birth != ‘1980-04-13’;」ともにnull指定されたレコードが表示されていないことが確認できます。
この理由としては先ほど説明したように、nullは等号(=)、等号否定(!=)、不等号(<>≦≧)の対象にならないからです。
データベースでnullを検索するには、専用の命令句「is Null」を使用する必要があるということを覚えておいてください。
またnull値以外を取得する際にも、専用の命令句「is not null」を使用するようにしましょう。
SQLでのnot null
ここまの説明でnullという用語については一通り理解していただけたのではないでしょうか。
次はこの記事の本題でもある「SQLにおけるnot null」について解説していきたいと思います。
まずSQLではnot nullとは制約を表します。
データベースでは任意でカラムを設定しますが、この時に「not null」という制約を設けることで、中身にnull値を指定できないようにすることが可能です。
指定方法は次の通りとなります。
CREATE TABLE テーブル名(カラム名 NOT NULL, ...);
この制約があるカラムにnull値を指定したレコードを挿入しようとすると、「Error: NOT NULL constraint failed: user.name」というエラーが表示されます。
またデータベースは中身が未指定(デフォルト)の場合にはnullを投げる仕組みとなっているため、カラムに対して何も指定せず追加などをしようとした場合にも同じようにエラーが表示されます。
まとめ
いかがでしたか?
今回はnullとSQLのnot nullについて解説してみました。
nullは熟練のプログラマーでも間違った使い方をしてしまう場合のあるややこしいものです。
しっかりと理解しておかないと思わぬ問題に発展する事も多くあるため、しっかりと理解できるまでこの記事を何度も読み返しながらマスターしましょう。