IS NULLとIS NOT NULL
欠損値を正しく判定します。
「IS NULLとIS NOT NULL」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
欠落値の検査
NULLとの比較は常にunknownを返すため、SQLには欠落値を検査する専用演算子としてIS NULLとIS NOT NULLがあります。
NULLを見つけたり除外したりする信頼できる方法は、これらだけです。このレッスンでは、これらを正しく使う方法を学びます。
-- Rows where phone is missing
SELECT name FROM customers WHERE phone IS NULL;
-- Rows where phone is present
SELECT name FROM customers WHERE phone IS NOT NULL;= NULLが失敗する理由
WHERE phone = NULLと書きたくなりますが、これは何にも一致しません。条件はすべての行でunknownに評価され、WHEREはtrueの行だけを残すためです。
結果は空集合になります。エラーが発生しないため、気付きにくいバグです。
-- Always returns 0 rows, even if NULLs exist
SELECT * FROM customers WHERE phone = NULL;
-- The fix
SELECT * FROM customers WHERE phone IS NULL;IS NULLの使い方
IS NULLは、値が欠落している場合に正確にtrueを返し、それ以外ではfalseを返します。unknownを返すことはありません。
そのため、明確なtrue/falseの結果が必要な場所で安全に使用できます。
SELECT id, name, (phone IS NULL) AS missing_phone
FROM customers;
-- id | name | missing_phone
-- ---+-------+--------------
-- 1 | Alice | f
-- 2 | Bob | t
-- 3 | Carol | tIS NOT NULLの使い方
IS NOT NULLは正反対です。値が存在する場合はtrue、欠落している場合はfalseを返します。
実際にデータがある行、たとえば電話をかけられる顧客に絞り込むために使います。
SELECT name, phone
FROM customers
WHERE phone IS NOT NULL;
-- name | phone
-- ------+----------
-- Alice | 555-0101AND / ORとの組み合わせ
NULLの検査は、ANDやORを使ってほかの条件と組み合わせられます。
たとえば、現在有効で、まだ電話番号が登録されていない顧客を見つけられます。これはデータ品質を確認する一般的なクエリです。
SELECT id, name
FROM customers
WHERE is_active = true
AND phone IS NULL;
-- Active customers missing a phone numberNOT INのNULL:落とし穴
リストにNULLが含まれていると、NOT INは問題のある動作をします。集合内のいずれかの値がNULLの場合、NOT INはすべての行に対してunknownを返すことがあり、期待していた結果が除外されます。
NOT EXISTSを使うか、先にサブクエリからNULLを除外してください。
-- Risky: if blocked_ids contains a NULL, this returns nothing
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked);
-- Safer
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked WHERE user_id IS NOT NULL);IS DISTINCT FROM
PostgreSQLには、NULLに対応した比較演算子としてIS DISTINCT FROMとIS NOT DISTINCT FROMがあります。
=とは異なり、NULL同士を等しいものとして扱い、NULLと値は異なるものとして扱います。常にtrueまたはfalseを返し、unknownを返すことはありません。
SELECT
NULL IS NOT DISTINCT FROM NULL AS a, -- true: both NULL = same
NULL IS DISTINCT FROM 5 AS b, -- true: NULL differs from 5
5 IS DISTINCT FROM 5 AS c; -- false: same valueNULLを許容する2つの列の比較
どちらもNULLになる可能性がある2つの列を比較する場合、通常の=では両方がNULLのケースを見落とします。IS NOT DISTINCT FROMなら、このケースも正しく処理できます。
値が不明な場合でも、変更されていない行を見つけるのに役立ちます。
-- Rows where old and new phone are 'the same',
-- counting NULL = NULL as same
SELECT id
FROM customer_changes
WHERE old_phone IS NOT DISTINCT FROM new_phone;NULLのカウント
IS NULLの実用的な使い方の1つは、データ品質の監査です。値が欠落している行の数を数えられます。
FILTER(PostgreSQL)またはCOUNT内のCASEと組み合わせると、NULLとNULL以外の数を並べてカウントできます。
SELECT
count(*) AS total,
count(*) FILTER (WHERE phone IS NULL) AS missing,
count(*) FILTER (WHERE phone IS NOT NULL) AS present
FROM customers;CHECK制約でのNULL検査
CHECK制約の中でNULLを検査し、「行が発送済みなら発送日が必要」のようなルールを適用できます。
注意:CHECK制約は、条件がtrueまたはunknownの場合に通過します。そのため、NULLのケースを慎重に検討してください。
CREATE TABLE orders (
id integer PRIMARY KEY,
status text NOT NULL,
ship_date date,
CHECK (status <> 'shipped' OR ship_date IS NOT NULL)
);ベストプラクティス
NULLを安全に扱うため、次の習慣を身に付けてください。
- 常に
IS NULL/IS NOT NULLで検査し、= NULLは決して使わないでください。 - NULLを許容するサブクエリでの
NOT INに注意してください。 - NULLに対応した等価比較には
IS DISTINCT FROMを使ってください。 count(*) FILTER (...)で欠落データを監査してください。
-- The reliable toolkit
WHERE col IS NULL
WHERE col IS NOT NULL
WHERE a IS DISTINCT FROM b
WHERE a IS NOT DISTINCT FROM bクイックチェック
phone列に値がない顧客をすべて取得したいとします。正しいWHERE句はどれでしょうか。
まとめ
欠損値を確認する正しい方法として、IS NULLとIS NOT NULLを学び、= NULLが決して機能しない理由も学びました。
NOT INの落とし穴、NULLに安全なIS DISTINCT FROM演算子、そしてFILTERを使ってNULLを監査する方法についても学びました。次は、COALESCEとNULLIFを使ってNULLを適切なデフォルト値に置き換える方法を学びます。
SELECT name FROM customers WHERE phone IS NULL;
SELECT name FROM customers WHERE phone IS NOT NULL;よくある質問
「IS NULLとIS NOT NULL」レッスンは無料ですか?
はい。「IS NULLとIS NOT NULL」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「IS NULLとIS NOT NULL」で何を学びますか?
欠損値を正しく判定します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「IS NULLとIS NOT NULL」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- NULLの本当の意味
- IS NULLとIS NOT NULL
- COALESCEとNULLIF
- 集約とJOINにおけるNULL