Maison >base de données >tutoriel mysql >Pourquoi « NOT IN » de MySQL échoue-t-il avec des sous-requêtes vides ?
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.
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.
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!