MySQLでNULLを挿入する方法:INSERTの書き方と空文字との違い

SQLと書かれたタイトル SQL

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】

※Amazonのアソシエイトとして、当サイトは適格販売により収入を得ています。

参考リンク

タイトルとURLをコピーしました