データベース設計の落とし穴!NULL(ヌル)の意味と使い方を初心者向けに徹底解説
生徒
「データベースの勉強を始めたのですが、表の中に時々出てくる『NULL』って何ですか?空っぽとは違うのでしょうか?」
先生
「それは非常に重要なポイントですね。NULL(ヌル)は、単なる『空っぽ』や『ゼロ』ではなく、『値がまだ決まっていない』とか『不明である』という状態を指します。現実の世界で言うと、アンケートの未回答欄のようなイメージです。」
生徒
「未回答……。それなら、文字が入っていないだけと考えればいいんですか?」
先生
「実はそこがプログラミングやSQL設計で一番迷いやすいところなんです。コンピュータにとっては『何もない(空文字)』と『分からない(NULL)』は全くの別物として扱われます。この違いを正しく理解しないと、計算が狂ったりデータが消えて見えたりするトラブルの原因になるんですよ。」
1. SQLとは何か?
SQLは、データベースと呼ばれる「大量のデータを整理して保存する箱」に対して指示を出すための言語です。例えば、会員名簿の中から特定の人を探したり、新しい人を追加したりするときに使います。銀行の残高管理から、SNSの投稿保存、ショッピングサイトの在庫管理まで、現代のあらゆるシステムでSQLが活躍しています。
SQLを使うことで、私たちは膨大なデータの中から一瞬で必要な情報を見つけ出し、計算し、並べ替えることができます。しかし、その「整理整頓」を正しく行うためには、データを入れる箱のルールをしっかり決めなければなりません。そのルール作りのことを「データモデリング」や「データベース設計」と呼びます。
エンジニアの必須スキル「SQL」を、 図解と豊富な練習問題でゼロから体系的に学びたい人へ。 MySQLやPostgreSQLなど、各種データベースに対応した不朽の入門書です。
SQL 第2版 ゼロからはじめるデータベース操作をAmazonで見る※ Amazon広告リンク
2. NULL(ヌル)の正体を知ろう
初心者の方がデータベースを操作する際、最初につまずくのがこの「NULL」という存在です。日本語では「ヌル」や「ナル」と読みます。これは、プログラミングの世界特有の言葉で、「値が存在しない状態」を意味します。
例えば、あなたがお店の顧客名簿を作っているとしましょう。項目には「名前」「電話番号」「メールアドレス」があります。あるお客さんはメールアドレスを教えてくれましたが、別のお客さんは教えてくれませんでした。この「教えてくれなかった(データが存在しない)」部分を、データベースでは「NULL」として扱います。
ここで注意が必要なのは、「0(ゼロ)」や「空文字(スペース)」とは違うということです。
- 0:「数値としてのゼロ」というデータがある。
- 空文字:「文字数がゼロの文字列」というデータがある。
- NULL:そもそもデータが何も入っていない、正体不明の状態。
3. なぜNULLを慎重に設計する必要があるのか?
「とりあえず、空いているところは全部NULLでいいじゃないか」と思うかもしれません。しかし、安易にNULLを許してしまうと、後でデータを集計したり検索したりするときに、思わぬミスが発生します。
最大の理由は、「NULLは何と計算してもNULLになる」というルールがあるからです。例えば、テストの点数を合計するプログラムを作ったとします。もし一人の点数がNULL(未受験でデータなし)だった場合、単純に合計計算をすると、全体の合計結果までNULLになってしまうことがあるのです。数学の計算で「50 + 100 + 不明 = 不明」となってしまうようなものです。
また、検索の際にも注意が必要です。「メールアドレスが登録されていない人を探す」という命令を出すとき、普段使う「=(イコール)」という記号がNULLには使えません。特別な書き方をしなければならないのです。このように、NULLは初心者にとって「扱いが少し難しい、特別な存在」なのです。
4. 実践:NULLが含まれるテーブルの操作
それでは、具体的にテーブルを見てみましょう。会員管理テーブル users を例にします。ここでは「email」と「age」にNULLが含まれる可能性がある設計になっています。
id | name | age | email
---+----------+------+-------------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | NULL | hanako@example.com
3 | 鈴木一郎 | 30 | NULL
4 | 田中次郎 | 40 | jiro@example.com
5 | 伊藤あみ | NULL | ami@example.com
6 | 渡辺健二 | 22 | NULL
このデータから、「メールアドレスが登録されていない人」だけを抽出してみましょう。このとき、SQLでは IS NULL という特別な命令を使います。
SELECT *
FROM users
WHERE email IS NULL;
この命令を実行した結果は、以下のようになります。メールアドレスがNULLの人だけが選ばれていますね。
id | name | age | email
---+----------+------+-------------------------
3 | 鈴木一郎 | 30 | NULL
6 | 渡辺健二 | 22 | NULL
5. NOT NULL制約(ノット・ヌル)という守り神
データベース設計において、初心者がまず覚えるべき強力なルールが 「NOT NULL制約」 です。これは、「この項目には絶対にNULLを入れてはいけません!」という禁止命令をテーブルにかけることです。
例えば、「名前」がNULLの会員名簿は役に立ちませんよね。誰だか分からないからです。また、ログインに使うパスワードがNULL(未設定)だと、セキュリティ上とても危険です。こうした「絶対にデータが必要な項目」には、設計段階で「NOT NULL」という設定を付けておきます。
こうすることで、もしプログラムのミスでデータを入れ忘れたとしても、データベース側が「エラー」を出して守ってくれます。初心者のうちは、「どうしてもNULLが必要な理由がない限り、基本はNOT NULLにする」 という考え方で設計すると、大きなトラブルを防ぐことができます。
6. NULLを避けるための「初期値(デフォルト値)」
NULLをできるだけ使わないための工夫として、「デフォルト値」という機能があります。これは、データが入力されなかったときに、自動的に決まった値を入れてくれる仕組みです。
例えば、ポイントサイトの「所持ポイント」という項目を考えてみましょう。新規登録したばかりの人は、まだポイントを持っていません。ここで「NULL(不明)」にするのではなく、「0」という初期値を設定しておくのです。そうすれば、後で全員のポイントを合計するときに、計算がスムーズに進みます。
以下の例では、新しいユーザーを追加する際に age(年齢)を指定しなかった場合、自動的に 0 が入るように設計されたテーブルを想定しています。
INSERT INTO users (id, name, email)
VALUES (7, '高橋三郎', 'saburo@example.com');
実行前のテーブル(追加前):
id | name | age | email
---+----------+------+-------------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | NULL | hanako@example.com
3 | 鈴木一郎 | 30 | NULL
4 | 田中次郎 | 40 | jiro@example.com
5 | 伊藤あみ | NULL | ami@example.com
6 | 渡辺健二 | 22 | NULL
実行後のテーブル(高橋さんが追加され、年齢にデフォルト値が適用された場合):
id | name | age | email
---+----------+------+-------------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | NULL | hanako@example.com
3 | 鈴木一郎 | 30 | NULL
4 | 田中次郎 | 40 | jiro@example.com
5 | 伊藤あみ | NULL | ami@example.com
6 | 渡辺健二 | 22 | NULL
7 | 高橋三郎 | 0 | saburo@example.com
7. NULLの計算に潜む罠(四則演算と関数)
ここでは、もう少し詳しくNULLが計算に与える影響を見ていきましょう。データベースには「集計関数」という、データの合計や平均を出す便利な機能があります。これらはNULLをどう扱うのでしょうか?
実は、多くの関数は「NULLを無視して」計算してくれます。例えば、AVG(平均)という関数を使うと、NULLの人は人数に含めずに平均を出してくれます。しかし、自分で行う「足し算(+)」などは、前述の通り結果がNULLになってしまいます。
具体的に、ユーザー全員の年齢の平均を出してみましょう。
SELECT AVG(age)
FROM users;
実行結果:
AVG(age)
---------
29.25
この結果 29.25 は、年齢がNULLの「佐藤花子さん」と「伊藤あみさん」を除いた、4人分のデータの平均値です。このように、関数によってNULLの扱いが異なるため、設計者は「この項目がNULLになっても、正しい計算結果が得られるか?」を常に考える必要があるのです。
8. 初心者が迷わないための設計ガイドライン
最後に、データベース設計でNULLに迷ったときの判断基準を整理します。これを意識するだけで、プロのような綺麗なデータ構造が作れるようになります。
① 原則として「NOT NULL」にする
まずは、すべての項目に「データを入れること」を義務付けるように考えましょう。住所や電話番号など、必須ではない項目も「未登録」という文字を入れるか、後述する空文字で対応できないか検討します。
② 数値項目は「0」で代用できないか考える
金額、個数、得点などの数値は、NULLよりも「0」の方が扱いやすいことが多いです。「まだ発生していない」のか「不明」なのかを厳密に分ける必要がないなら、0を初期値にしましょう。
③ 「NULL」を使うべき正当な理由があるときだけ使う
例えば「退会日」という項目。まだ退会していない人は、日付を入れることができません。ここを無理やり「1900年1月1日」などの適当な日付にすると、後でデータを見た人が混乱します。このように「値が存在しないこと自体に意味がある」場合に限り、NULLを活用しましょう。
データベースの世界は奥が深いですが、このNULLの扱いをマスターすれば、データの整合性(正しさ)が保たれた、使い勝手の良いシステムを構築できるようになります。パソコン操作に不慣れな方でも、「整理整頓のルール」として捉えれば、きっと理解を深めていけるはずです。