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
Libérer: 2024-12-29 15:48:12
original
745 Les gens l'ont consulté

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

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!

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