MySQL で NULL を入れるには、INSERT の VALUES に引用符なしで NULL と書きます。その列を INSERT の列の並びから省いても、既定値(DEFAULT)がなければ NULL が入ります。
-- どちらも email に NULL が入る
INSERT INTO customers (name, email) VALUES ('山田', NULL);
INSERT INTO customers (name) VALUES ('佐藤');
'NULL' と引用符で囲むと、4文字の文字列が入ってしまうので注意してください。この記事では、空文字 '' との違い、NOT NULL の列に入れたときのエラー、入れた NULL を検索する方法を、実行結果つきで説明します。以下の結果は MySQL 8.0 で実際に実行したものです。
このシナリオで考える
お店の会員テーブルを使います。名前は必須、メールアドレスと電話番号は空でもよい、ポイントは入れなければ0、という作りです。
CREATE TABLE customers (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) NULL,
phone VARCHAR(20) NULL,
points INT NOT NULL DEFAULT 0
);
列の定義に NULL と書くと NULL を入れてよい列、NOT NULL と書くと入れてはいけない列になります。何も書かなければ NULL を入れてよい列です。
INSERTでNULLを入れる2つの書き方
4人分の会員を入れます。山田さんはメールアドレスがなく、佐藤さんはメールアドレスも電話番号もありません。鈴木さんは、比べるために空文字 '' を入れます。
-- 1. VALUES に NULL と書く
INSERT INTO customers (name, email, phone) VALUES ('山田', NULL, '090-1111-2222');
-- 2. 列を省く(email は省略、phone は NULL と書く)
INSERT INTO customers (name, phone) VALUES ('佐藤', NULL);
-- 比べるために空文字を入れる
INSERT INTO customers (name, email, phone) VALUES ('鈴木', '', '');
INSERT INTO customers (name, email, phone) VALUES ('田中', 'tanaka@example.com', NULL);
SELECT * FROM customers;
+----+--------+--------------------+---------------+--------+
| id | name | email | phone | points |
+----+--------+--------------------+---------------+--------+
| 1 | 山田 | NULL | 090-1111-2222 | 0 |
| 2 | 佐藤 | NULL | NULL | 0 |
| 3 | 鈴木 | | | 0 |
| 4 | 田中 | tanaka@example.com | NULL | 0 |
+----+--------+--------------------+---------------+--------+
佐藤さんの email は省いただけですが、NULL になっています。points は4人とも省いたので、既定値の 0 が入りました。省いた列に入る値は、次のように決まります。
| 列の定義 | INSERT で省いたとき |
|---|---|
| NULL 可・DEFAULT なし(email) | NULL が入る |
| DEFAULT あり(points) | DEFAULT の値が入る |
| NOT NULL・DEFAULT なし(name) | エラー(厳格モードのとき) |
DEFAULT のある列に既定値を入れたいときは、値の代わりに DEFAULT と書くこともできます。
INSERT INTO customers (name, email, phone, points) VALUES ('高橋', NULL, NULL, DEFAULT);
SELECT id, name, points FROM customers WHERE name = '高橋';
+----+--------+--------+
| id | name | points |
+----+--------+--------+
| 5 | 高橋 | 0 |
+----+--------+--------+
NULLと空文字”の違い
NULL は「値がない・わからない」、空文字 '' は「長さ0の文字列という値がある」という意味です。見た目は似ていても、検索や集計では別のものとして扱われます。
SELECT name FROM customers WHERE email IS NULL;
+--------+
| name |
+--------+
| 山田 |
| 佐藤 |
| 高橋 |
+--------+
SELECT name FROM customers WHERE email = '';
+--------+
| name |
+--------+
| 鈴木 |
+--------+
件数を数える COUNT(列) も、NULL は数えませんが空文字は数えます。
SELECT COUNT(*) AS all_rows, COUNT(email) AS has_email FROM customers;
+----------+-----------+
| all_rows | has_email |
+----------+-----------+
| 5 | 2 |
+----------+-----------+
メールアドレスを持っているのは田中さんだけなのに、2人と数えられました。空文字の鈴木さんが入っているためです。「ない」ことを表すなら、NULL か空文字のどちらかにそろえます。迷ったら NULL にしておくと、IS NULL だけで探せます。すでに入っている空文字は、UPDATE で NULL に直せます。
UPDATE customers SET phone = NULL WHERE name = '鈴木';
SELECT name, phone FROM customers WHERE name = '鈴木';
+--------+-------+
| name | phone |
+--------+-------+
| 鈴木 | NULL |
+--------+-------+
よくある落とし穴
NOT NULL の列に NULL を入れるとエラーになる
INSERT INTO customers (name, email) VALUES (NULL, 'x@example.com');
ERROR 1048 (23000): Column 'name' cannot be null
必ず入れてほしい列は NOT NULL にしておくと、入れ忘れをこのエラーで止められます。制約の書き方は「NOT NULL・UNIQUE・CHECK制約で不正データを防ぐ」でまとめています。
= NULL では検索できない
NULL は「わからない値」なので、= NULL で比べた結果も NULL(真でも偽でもない)になります。WHERE は真の行だけを返すので、1行も返りません。
SELECT name FROM customers WHERE email = NULL; -- 0行
NULL を探すときは IS NULL、NULL 以外を探すときは IS NOT NULL を使います。
表示のときに NULL を別の文字にする
画面や CSV に NULL と出したくないときは、COALESCE で置きかえます。
SELECT name, COALESCE(email, '(未登録)') AS email FROM customers;
+--------+--------------------+
| name | email |
+--------+--------------------+
| 山田 | (未登録) |
| 佐藤 | (未登録) |
| 鈴木 | |
| 田中 | tanaka@example.com |
| 高橋 | (未登録) |
+--------+--------------------+
並べかえると NULL が先頭に来る
MySQL の昇順(ASC)では、NULL はいちばん小さい値として先頭に来ます。降順(DESC)では最後です。
SELECT name, email FROM customers ORDER BY email;
+--------+--------------------+
| name | email |
+--------+--------------------+
| 山田 | NULL |
| 佐藤 | NULL |
| 高橋 | NULL |
| 鈴木 | |
| 田中 | tanaka@example.com |
+--------+--------------------+
PostgreSQL や Oracle は昇順で NULL が最後に来るので、データベースによって並び方が違う点に注意してください。
まとめ
MySQL で NULL を入れるには、VALUES に引用符なしで NULL と書くか、その列を省きます。省いた列は、DEFAULT があればその値、なければ NULL になります。空文字 '' は NULL とは別の値で、IS NULL では見つからず、COUNT では数えられます。NULL を探すときは = NULL ではなく IS NULL を使ってください。
もっと学ぶなら【PR】
- スッキリわかるSQL入門 第4版:練習問題がたくさんある入門書。手を動かして基本を固めたい人向け
- SQLアンチパターン 第2版:テーブル設計やクエリでやりがちな失敗と、その直し方をまとめた本
※Amazonのアソシエイトとして、当サイトは適格販売により収入を得ています。

