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 | NULLNULLはゼロではない
NULLを数値の0と同じように扱うのは、よくある間違いです。この2つはまったく異なります。
0は既知の値、つまりゼロです。NULLは値が欠落している、または不明であることを意味します。
口座残高が0なら、顧客の資金はゼロです。NULLなら、残高がまだわかっていないだけです。
SELECT id, balance
FROM accounts;
-- id | balance
-- ---+--------
-- 1 | 0 <- known: empty wallet
-- 2 | NULL <- unknown: not recorded yetNULLは空文字列ではない
テキスト列では、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 unknown3値論理
通常の論理には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; -- unknownNULL = 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 AliceNULLは算術演算を通じて伝播する
式の中では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 | NULLNULLを防ぐ: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フィードバックを取得できます。ローカル設定は不要です。