MySQLでNULLに対して「=」「<」「<>」などの比較演算子が使えないのはなぜ?理由と正しい判定方法
MySQLでNULLに比較演算子を使えない理由
MySQLにおいて、NULLは「不明な値(未知の値)」を表す特殊な値です。そのため、「=」(等しい)、「<」(より小さい)、「<>」(等しくない)といった比較演算子をNULLに対して使用しても、TRUEやFALSEといった意味のある結果は返されず、比較結果は常にNULLとなります。
具体的な値である「10」と「不明な値(NULL)」を比較すること自体が論理的に定義されていないためです。「不明なもの」と「10」が等しいのかどうかは、判断しようがないからです。
実際に次の例でこの動作を確認してみましょう。
mysql> SELECT 10 = NULL, 10 < NULL, 10 <> NULL; +-----------+-----------+------------+ | 10 = NULL | 10 < NULL | 10 <> NULL | +-----------+-----------+------------+ | NULL | NULL | NULL | +-----------+-----------+------------+ 1 row in set (0.07 sec)
上記の実行結果のように、どの比較演算でも戻り値はNULLとなり、まったく意味のある情報が得られません。
NULLを判定する正しい方法:IS NULL / IS NOT NULL
ある値がNULLかどうかを調べたい場合は、比較演算子ではなく、NULL専用の演算子であるIS NULLまたはIS NOT NULLを使用します。
mysql> SELECT 10 IS NULL, 10 IS NOT NULL; +------------+----------------+ | 10 IS NULL | 10 IS NOT NULL | +------------+----------------+ | 0 | 1 | +------------+----------------+ 1 row in set (0.00 sec)
このようにIS NULL演算子を使えば、0(偽)や1(真)といった明確な結果を得ることができます。WHERE句などでNULLを含むカラムを検索する際も、「column_name = NULL」ではなく「column_name IS NULL」を使うのが基本ルールなので、覚えておきましょう。
-
MySQLのLIKEクエリで「%」を含む列値を検索する方法【エスケープ処理の基本】
MySQLのLIKEクエリで「%」を含む値を検索するには?MySQLでは、「%」はLIKE句におけるワイルドカードとして機能するため、そのまま検索することはできません。「%」という文字そのものを含む列値を検索したい場合は、バックスラッシュ(\)によるエスケープ処理が必要です。基本構文「%」を含む列値を検索する場合の構文は以下の通りです。select * from yourTableNamewhere yourColumnName LIKE \%%;ポイントは、検索対象の「%」の直前に「\(バックスラッシュ)」を付けることです。これにより、ワイルドカードではなく通常の文字として扱われます。実際に
-
MySQLで複数のLIKE演算子をORDER BYと組み合わせる方法
MySQLでは、複数のLIKE演算子をORDER BY句の中で組み合わせることで、指定したキーワードにより多く一致するレコードを優先的に並べ替えることができます。このテクニックは、LIKE演算子が「一致すれば1」「一致しなければ0」を返すという性質を利用しています。各条件の結果を足し合わせることで一致数を計算し、降順(DESC)にソートすることで、関連度の高いレコードを上位に表示できるのです。以下は、複数のLIKE演算子をORDER BYと組み合わせて実装する際の基本構文です。select *from yourTableName order by ( yourColumnName li