Maison >base de données >tutoriel mysql >Pourquoi utiliser NOT EXISTS ou des jointures explicites au lieu de NOT IN dans les requêtes SQL ?

Pourquoi utiliser NOT EXISTS ou des jointures explicites au lieu de NOT IN dans les requêtes SQL ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-03 21:15:08331parcourir

Why Use NOT EXISTS or Explicit Joins Instead of NOT IN in SQL Queries?

Les périls de "NOT IN" dans les requêtes SQL

Lors de la tentative d'une requête qui vérifie si les données d'une table n'existent pas dans une autre , l'opérateur "NOT IN" peut conduire à des résultats inattendus, notamment lors de la gestion de valeurs nulles.

Le problème avec "NOT IN" IN"

Dans la requête fournie, la clause "NOT IN" compare les résultats d'une sous-requête à la colonne "ID_Courses" de la table "Grade" :

Grade.ID_Courses NOT IN (SELECT ID_Courses FROM Evaluation WHERE NAME='JOHN' and Year=1)

Si la sous-requête renvoie des valeurs nulles, la clause "NOT IN" sera évaluée comme fausse, même si l'enregistrement "JOHN" spécifié avec "Année" 1 existe dans le Tableau « Note ». En effet, la logique à trois valeurs dans SQL interprète null comme « inconnu », ce qui conduit à une évaluation incorrecte.

Alternatives à « NOT IN »

Pour éviter ce problème , il est recommandé d'utiliser des méthodes alternatives telles que NOT EXISTS ou des jointures explicites :

NOT EXISTS

SELECT Grade.ID_Courses, Course.ID_Courses, Grade.NAME, 
    Course.NAME, Grade.ID_Courses,
    Evaluation.NAME,
    Evaluation.Year,    
    Grade.Year
    from Grade
    LEFT JOIN Course ON Grade.ID_Courses=Course.ID_Courses
    LEFT JOIN Evaluation ON Grade.NAME=Evaluation.NAME AND GRADE.YEAR = Evaluation.YEAR
    WHERE 
    Grade.NAME='JOHN' and 
    Evaluation.NAME IS NULL
    GROUP BY Grade.ID_Courses

Jointures explicites

SELECT Grade.ID_Courses, Course.ID_Courses, Grade.NAME, 
    Course.NAME, Grade.ID_Courses,
    Evaluation.NAME,
    Evaluation.Year,    
    Grade.Year
    from Grade
    LEFT JOIN Course ON Grade.ID_Courses=Course.ID_Courses
    LEFT JOIN Evaluation ON Grade.NAME=Evaluation.NAME AND GRADE.YEAR = Evaluation.YEAR
    WHERE 
    Grade.NAME='JOHN' and 
    NOT (Evaluation.NAME IS NOT NULL)
    GROUP BY Grade.ID_Courses

En utilisant ces alternatives, vous pouvez vous assurer que la requête identifie avec précision les enregistrements dans lesquels les données spécifiées ne sont pas existent dans l'autre table, quelle que soit la présence de valeurs nulles.

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