ホームページ >データベース >mysql チュートリアル >SQL で「NOT IN」が NULL 値を含む予期しない結果を返すのはなぜですか?
SQL の NOT IN
句と NULL 値のニュアンス
SQL では、特に NULL が存在する場合に、データを値セットと比較することが頻繁に問題になります。 いくつかのクエリ例を使ってこれを調べてみましょう:
<code class="language-sql">A: SELECT 'true' WHERE 3 IN (1, 2, 3, NULL); B: SELECT 'true' WHERE 3 NOT IN (1, 2, NULL);</code>
クエリ A は結果を生成しますが、クエリ B は結果を生成しません。この動作は、SQL が NOT IN
句内の NULL を処理する方法に起因します。
SQL では、NULL は不明な値または欠損値を意味します。 IN
や NOT IN
などの述語との相互作用は、ANSI_NULLS
設定によって制御されます。
ANSI_NULLS
が有効 (デフォルト) の場合、IS NULL
または IS NOT NULL
を使用して明示的にチェックしない限り、NULL を含む比較は UNKNOWN と評価されます。
クエリ A では、3 を NULL を含むリストと比較すると、3 が存在するため TRUE と評価されます。 NULL 値は全体的な結果には影響しません。
ただし、クエリ B は NOT IN
を使用します。 ANSI_NULLS
がオンになっているため、比較 3 NOT IN (1, 2, NULL)
は 3 と NULL の比較により UNKNOWN と評価されます。 その結果、クエリは空のセットを返します。
ANSI_NULLS
を無効にすると、これが変更されます。 NULL は他の値と同様に扱われます。 このシナリオでは、3 は 1、2、および NULL とは異なるため、3 NOT IN (1, 2, NULL)
は TRUE と評価されます。 したがって、クエリ B は ANSI_NULLS
がオフの結果を返します。
これは、SQL で NULL を扱うときの ANSI_NULLS
設定の重要性を強調します。 この設定を管理することで、NULL を含む述語の動作を制御し、必要なクエリ結果を取得できます。
以上がSQL で「NOT IN」が NULL 値を含む予期しない結果を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。