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
Libérer: 2025-01-03 21:15:08
original
266 Les gens l'ont consulté

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)
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal