Maison >base de données >tutoriel mysql >Comment les valeurs NULL affectent-elles le résultat d'une clause NOT IN ?

Comment les valeurs NULL affectent-elles le résultat d'une clause NOT IN ?

DDD
DDDoriginal
2025-01-23 12:47:10477parcourir

How Do NULL Values Affect the Outcome of a NOT IN Clause?

Comprendre les valeurs NULL et la clause NOT IN

Des incohérences surviennent souvent lors de l'utilisation de clauses NOT IN par rapport à des LEFT JOIN, en particulier lorsqu'il s'agit de valeurs NULL. Examinons cela avec deux exemples de requêtes :

Requête A :

<code class="language-sql">SELECT 'true' WHERE 3 IN (1, 2, 3, NULL);</code>

Requête B :

<code class="language-sql">SELECT 'true' WHERE 3 NOT IN (1, 2, NULL);</code>

La requête A produit un résultat, contrairement à la requête B. Cette différence provient de la façon dont SQL gère les comparaisons impliquant des NULL valeurs.

Disséquer les requêtes

Décomposons chaque requête pour comprendre le comportement :

Requête A :

Cette requête peut être simplifiée en :

<code class="language-sql">SELECT 'true' WHERE 3 = 1 OR 3 = 2 OR 3 = 3 OR 3 = NULL;</code>

Étant donné que 3 = 3 est évalué à TRUE, la requête renvoie un résultat.

Requête B :

Cette requête se simplifie en :

<code class="language-sql">SELECT 'true' WHERE 3 != 1 AND 3 != 2 AND 3 != NULL;</code>

Avec ANSI_NULLS activé (valeur par défaut dans la plupart des bases de données SQL), 3 != NULL est évalué à UNKNOWN. Une condition AND avec UNKNOWN fait que le prédicat entier est UNKNOWN, ce qui entraîne le retour d'aucune ligne.

Si ANSI_NULLS est désactivé, 3 != NULL est évalué à TRUE, renvoyant potentiellement une ligne.

Conclusion

La présence de valeurs NULL dans une clause NOT IN a un impact significatif sur les résultats de la requête en raison de la logique à trois valeurs de SQL (VRAI, FAUX, INCONNU) et du paramètre ANSI_NULLS. Il est crucial d'être conscient de ce comportement lorsque vous travaillez avec des valeurs NULL pour éviter des résultats inattendus. L'utilisation des vérifications LEFT JOIN et IS NULL fournit souvent une alternative plus fiable pour gérer les valeurs NULL dans de tels scénarios.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn