SQLでNULLを見つける魔法の杖!「IS NULL」と「= NULL」の使い分け術
SQLにおける「IS」と「=」演算子の違い
SQLにおいて、値を比較する際には「=」と「IS」という2種類の演算子がよく使用されます。一見同じように見えますが、実は異なる動作をするため、混同すると予期せぬ結果を招きえます。
本記事では、「IS」と「=」演算子の違いを分かりやすく解説し、それぞれの使い分けの例も紹介します。
「=」演算子
「=」演算子は、2つのオペランドの値が等しいかどうかを比較します。データ型が一致していれば、数値、文字列、日付など、あらゆる種類のデータを比較できます。
例:
SELECT * FROM customers WHERE id = 101;
このクエリは、「customers」テーブルで id
が 101 のレコードをすべて選択します。
一方、「IS」演算子は、オペランドがNULLかどうかを検査します。NULLは、データベースに値が存在しないことを表す特殊な値です。
「IS」演算子には、以下の2種類があります。
- IS NOT NULL: オペランドがNULLではないかどうかを検査します。
SELECT * FROM customers WHERE name IS NULL;
「=」と「IS」の違い
項目 | 「=」演算子 | 「IS」演算子 |
---|---|---|
比較対象 | 値 | NULLかどうか |
データ型 | 一致していれば可 | 不要 |
用途 | 値の等価性を比較 | NULLの存在をチェック |
次の表は、「customers」テーブルの name
列の値を「=」と「IS」演算子で比較した場合の結果を示しています。
名前 | 「=」演算子 | 「IS」演算子 |
---|---|---|
田中一郎 | 田中一郎と一致 | NULLではない |
佐藤二郎 | 佐藤二郎と一致 | NULLではない |
(なし) | NULLと一致しない | NULL |
「IS」演算子の注意点
- 複数の列を比較する場合、すべての列がNULLではないことを確認する必要があります。
- 「IS」演算子は、比較対象の列がNULL許容であるかどうかに依存します。列がNULL許容でない場合、「IS NULL」と「= NULL」は同じ結果を返します。
- 「IS」演算子は、数値、文字列、日付など、あらゆるデータ型に対して使用できます。
「=」と「IS」演算子は、それぞれ異なる目的で使用されます。
- NULLの存在をチェックしたい場合は「IS」演算子を使用します。
- 値の等価性を比較したい場合は「=」演算子を使用します。
SELECT * FROM customers WHERE name IS NULL;
SELECT * FROM customers WHERE age >= 30;
例3:顧客テーブルの「address」列が空文字ではないレコードをすべて選択する
SELECT * FROM customers WHERE address != '';
SELECT * FROM customers WHERE phone IS NULL OR phone = '';
SQLにおける「IS NULL」と「= NULL」の別の違い
論理演算子との扱い
「IS NULL」と「= NULL」は、論理演算子 (AND
、OR
、NOT
) と組み合わせた場合に、異なる動作をします。
「IS NULL」の場合
NOT
と組み合わせた場合、NULLではないかどうかを検査します。AND
やOR
と組み合わせた場合でも、NULLかどうかのみを検査します。
SELECT * FROM customers WHERE name IS NULL AND age = 30;
SELECT * FROM customers WHERE name = NULL AND age = 30;
このクエリは、「customers」テーブルで name
列と age
列がどちらもNULLのレコードをすべて選択しません。これは、「= NULL」が値の等価性を比較するためです。
- 「= NULL」は、単独で使用するか、値の等価性を比較する場合に使用します。
- 論理演算子と組み合わせる場合は、「IS NULL」を使用する方が適切です。
- 複雑なクエリを作成する場合は、適切なインデックスが使用されていることを確認してください。
- 上記の説明は、ANSI SQL 標準に基づいています。データベースによっては、独自の挙動をする場合があるため、ドキュメントを確認する必要があります。
sql sqlite null