Maison >base de données >tutoriel mysql >Comment interroger efficacement plusieurs tables MySQL pour rechercher des écarts lors de la gestion des valeurs NULL ?

Comment interroger efficacement plusieurs tables MySQL pour rechercher des écarts lors de la gestion des valeurs NULL ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-27 02:34:09574parcourir

How to Efficiently Query Multiple MySQL Tables to Find Discrepancies While Handling NULL Values?

MySQL "NOT IN" Interrogation de plusieurs tables

La requête MySQL donnée cherche à identifier les écarts entre les données des tables de note et d'évaluation en excluant les lignes de note qui sont présentes en Évaluation. Cependant, la requête d'origine ne parvient à récupérer aucun résultat lorsque le nom spécifié ("JOHN") n'est pas trouvé dans l'évaluation.

Comprendre le problème avec "NOT IN"

Le "NOT IN" L'opérateur, tel qu'utilisé dans la requête d'origine, est problématique si une colonne impliquée peut contenir des valeurs NULL. Dans MySQL, NULL représente une valeur inconnue ou manquante, et son interaction avec certains opérateurs peut conduire à des résultats inattendus.

Solution : éviter "NOT IN"

Pour résoudre ce problème, il est recommandé de évitez d'utiliser "NOT IN" lorsque vous traitez des colonnes pouvant contenir des valeurs NULL. Envisagez plutôt d'utiliser des approches alternatives :

  • EXPLICIT JOINS : Au lieu d'utiliser la clause WHERE pour joindre des tables, spécifiez explicitement les jointures à l'aide des instructions JOIN. Cela permet d'obtenir des résultats plus précis et prévisibles.
  • SOUS-REQUÊTE NON EXISTE : Vérifiez l'existence de lignes dans une table qui n'existent pas dans une autre table à l'aide d'une sous-requête NOT EXISTS imbriquée.

Exemple : Utilisation de NOT EXISTS

La requête modifiée suivante utilise NOT EXISTS pour obtenir les résultats souhaités :

SELECT
  G.ID_Courses,
  C.ID_Courses,
  G.NAME,
  C.NAME,
  G.ID_Courses,
  E.NAME,
  E.Year,
  G.Year
FROM Grade AS G
INNER JOIN Course AS C
  ON G.ID_Courses = C.ID_Courses
LEFT JOIN Evaluation AS E
  ON G.NAME = E.NAME AND G.Year = E.Year
WHERE
  NOT EXISTS(
    SELECT
      1
    FROM Evaluation
    WHERE
      NAME = G.NAME AND Year = G.Year
  )
  AND G.NAME = 'JOHN'
  AND G.Year = 1
GROUP BY
  G.ID_Courses;

En utilisant NOT EXISTS, cette requête garantit que les lignes de Grade qui n'ont pas de lignes correspondantes dans Évaluation seront toujours incluses dans la sortie.

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