0Pricing
SQL Academy · レッスン

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 | t

IS NOT NULLの使い方

IS NOT NULLは正反対です。値が存在する場合はtrue、欠落している場合はfalseを返します。

実際にデータがある行、たとえば電話をかけられる顧客に絞り込むために使います。

SELECT name, phone
FROM customers
WHERE phone IS NOT NULL;

-- name  | phone
-- ------+----------
-- Alice | 555-0101

AND / ORとの組み合わせ

NULLの検査は、ANDやORを使ってほかの条件と組み合わせられます。

たとえば、現在有効で、まだ電話番号が登録されていない顧客を見つけられます。これはデータ品質を確認する一般的なクエリです。

SELECT id, name
FROM customers
WHERE is_active = true
  AND phone IS NULL;

-- Active customers missing a phone number

NOT 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 value

NULLを許容する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フィードバックを取得できます。ローカル設定は不要です。

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

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