Maison >base de données >tutoriel mysql >Comment les valeurs NULL affectent-elles le résultat d'une clause NOT IN ?
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!