0Pricing
SQL Academy · レッスン

NULLの本当の意味

未知であり、0でも空でもありません。

「NULLの本当の意味」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

NULLを知る

NULLは、SQLで「わからない」ことを表す方法です。ゼロでも空文字列でもfalseでもなく、値が存在しないことを表します。

列に既知の値がない場合、データベースはそこにNULLを格納します。NULLの動作を学ぶことは、正しいクエリを書くための最も重要なステップの1つです。

-- A customers table where some phone numbers are unknown
SELECT id, name, phone
FROM customers;

-- id | name    | phone
-- ---+---------+------------
--  1 | Alice   | 555-0101
--  2 | Bob     | NULL        <- phone unknown
--  3 | Carol   | NULL

NULLはゼロではない

NULLを数値の0と同じように扱うのは、よくある間違いです。この2つはまったく異なります。

  • 0は既知の値、つまりゼロです。
  • NULLは値が欠落している、または不明であることを意味します。

口座残高が0なら、顧客の資金はゼロです。NULLなら、残高がまだわかっていないだけです。

SELECT id, balance
FROM accounts;

-- id | balance
-- ---+--------
--  1 | 0        <- known: empty wallet
--  2 | NULL     <- unknown: not recorded yet

NULLは空文字列ではない

テキスト列では、NULLと空文字列''も異なります。

  • ''は長さ0の文字列であり、既知の、存在する値です。
  • NULLは文字列がまったく指定されていないことを意味します。

空のメモを意図的に保存することも、メモ自体を完全に欠落させることもできます。SQLはこの2つを区別します。

SELECT id, note, length(note) AS note_len
FROM tickets;

-- id | note | note_len
-- ---+------+----------
--  1 | ''   |        0   <- empty but present
--  2 | NULL |     NULL   <- absent; length is also unknown

3値論理

通常の論理にはtrueとfalseの2つの結果があります。SQLでは、これにunknownが加わります。

NULLを含む比較はすべてunknownになります。持っていない値と比較することはできないためです。これを3値論理と呼びます。

-- Each comparison with NULL returns UNKNOWN, not true/false
SELECT
  NULL = 5      AS eq,      -- unknown
  NULL <> 5     AS neq,     -- unknown
  NULL = NULL   AS self_eq, -- unknown (!)
  NULL > 0      AS gt;      -- unknown

NULL = NULLはtrueではない

最も意外なルールは、NULL = NULLがtrueではないことです。評価結果はunknownになります。

なぜでしょうか。2つの値がどちらも不明なら、それらが等しいとは言えません。どのような値である可能性もあるからです。何かがNULLであるかを確認するには、=ではなくIS NULLを使う必要があります。

-- Wrong: never returns rows, because NULL = NULL is unknown
SELECT * FROM customers WHERE phone = NULL;

-- Right: use IS NULL
SELECT * FROM customers WHERE phone IS NULL;

WHEREはTRUEの行だけを残す

WHERE句は、条件がtrueの場合にだけ行を残します。条件がfalseまたはunknownの行は削除されます。

そのため、NULLを含む列を=でフィルタリングすると、表示されると思っていた行が気付かないうちに除外されます。

-- Bob and Carol have NULL phones, so phone = '555-0101'
-- is UNKNOWN for them and they are excluded.
SELECT name
FROM customers
WHERE phone = '555-0101';

-- Returns only Alice

NULLは算術演算を通じて伝播する

式の中ではNULLが伝播します。NULLを含むほとんどすべての算術演算や文字列操作は、NULLを生成します。

入力の1つがわからなければ、結果もわからないためです。

SELECT
  10 + NULL    AS sum,    -- NULL
  100 * NULL   AS prod,   -- NULL
  NULL / 2     AS div,    -- NULL
  'Hi ' || NULL AS greet; -- NULL (string concat)

NULLが生じる場所

NULLは、次のような一般的な状況で現れます。

  • NULLを許容する列を省略したINSERT。
  • 片方に一致する行がない外部結合。
  • 0行に対する集計(たとえば、空集合のSUMはNULLを返します)。

発生源がわかると、どのように扱うべきか判断しやすくなります。

-- Omitting phone inserts NULL automatically
INSERT INTO customers (id, name) VALUES (4, 'Dan');

SELECT id, name, phone FROM customers WHERE id = 4;
-- 4 | Dan | NULL

NULLを防ぐ:NOT NULL

列に必ず値が必要な場合は、NOT NULLを宣言します。するとデータベースは、値を空のままにしようとする行を拒否します。

これはデータをクリーンに保ち、後でNULLに悩まされるのを防ぐ強力な方法です。

CREATE TABLE users (
  id    integer PRIMARY KEY,
  email text NOT NULL,   -- must always be provided
  bio   text             -- nullable: optional
);

-- This fails: email cannot be NULL
INSERT INTO users (id, bio) VALUES (1, 'hi');

NULLとDISTINCT / GROUP BY

SQLがNULLを等しいものとして扱う場所が1つあります。それはグループ化と重複排除です。

DISTINCTとGROUP BYでは、すべてのNULL値が1つのグループにまとめられます。ほかの場所ではNULL = NULLがunknownになるにもかかわらずです。この特別な扱いによって、グループ化が便利に機能します。

SELECT phone, count(*)
FROM customers
GROUP BY phone;

-- phone    | count
-- ---------+------
-- 555-0101 |     1
-- NULL     |     2   <- all NULLs grouped together

メンタルモデルのまとめ

NULLを見たら、常に次のルールを思い出してください。

  • NULLはゼロでも空でもなく、不明を意味します。
  • NULLとの比較結果はunknownになります。IS NULL / IS NOT NULLを使ってください。
  • WHEREはtrueの行だけを残します。
  • NULLとの算術演算の結果はNULLになります。
  • グループ化ではNULLが1つのグループとして扱われます。
-- The two correct NULL tests
SELECT name FROM customers WHERE phone IS NULL;
SELECT name FROM customers WHERE phone IS NOT NULL;

確認問題

標準SQLでは、式NULL = NULLは何に評価されますか。

まとめ

これで、NULLが実際には何であるかを理解できました。NULLは欠落または不明な値を示すマーカーであり、0や''とは異なります。

SQLの3値論理、= NULLが決して機能しない理由、NULLが算術演算を通じて伝播する仕組み、そしてWHEREがunknownの行を除外することを学びました。次は、IS NULLとIS NOT NULLを使ってNULLを正しく検査する方法を学びます。

-- Remember the golden rule
SELECT * FROM customers WHERE phone IS NULL;     -- correct
-- SELECT * FROM customers WHERE phone = NULL;   -- always empty!

よくある質問

「NULLの本当の意味」レッスンは無料ですか?

はい。「NULLの本当の意味」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「NULLの本当の意味」で何を学びますか?

未知であり、0でも空でもありません。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「NULLの本当の意味」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. NULLの本当の意味
  2. IS NULLとIS NOT NULL
  3. COALESCEとNULLIF
  4. 集約とJOINにおけるNULL
← SQL Academyに戻る