Maison >base de données >tutoriel mysql >Pourquoi « NOT IN » de MySQL échoue-t-il avec des sous-requêtes vides ?

Pourquoi « NOT IN » de MySQL échoue-t-il avec des sous-requêtes vides ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-29 15:48:12736parcourir

Why Does MySQL's `NOT IN` Fail with Empty Subqueries?

Requête MySQL "NOT IN" sur trois tables

Dans votre requête, vous avez inclus la condition Grade.ID_Courses NOT IN ( SELECT ID_Courses FROM Evaluation WHERE NAME='JOHN' et Year=1) pour filtrer les lignes du tableau des notes qui n'existent pas dans la table d'évaluation avec les mêmes valeurs NOM et Année. Cependant, lorsque le nom « JOHN » n'est pas présent dans la table d'évaluation, la requête ne produit aucun résultat.

Pourquoi PAS IN peut être gênant

Une limitation L'utilisation de NOT IN avec des sous-requêtes est sa susceptibilité aux incohérences lorsque l'une des sous-requêtes contient des valeurs NULL. En effet, SQL utilise une logique à trois valeurs, où NULL représente une valeur inconnue ou manquante. Lorsque NOT IN est appliqué à une sous-requête pouvant contenir des valeurs NULL, les résultats peuvent devenir imprévisibles ou incorrects.

Alternatives à NOT IN

Pour atténuer ces problèmes , il est recommandé d'éviter d'utiliser NOT IN avec des sous-requêtes pouvant contenir des valeurs NULL. Au lieu de cela, des alternatives plus fiables telles que NOT EXISTS ou des jointures explicites peuvent être utilisées.

Par exemple, vous pouvez réécrire votre requête à l'aide de l'opérateur NOT EXISTS comme suit :

SELECT Grade.ID_Courses,
       Course.ID_Courses,
       Grade.NAME,
       Course.NAME,
       Grade.ID_Courses,
       Evaluation.NAME,
       Evaluation.Year,
       Grade.Year
FROM Grade
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 Grade.Year = 1
  AND Evaluation.NAME IS NULL;

Utiliser des jointures explicites au lieu de la clause WHERE, comme suggéré dans la solution fournie, peut également améliorer les performances et la lisibilité de votre requête.

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