Heim > Datenbank > MySQL-Tutorial > Warum schlägt „NOT IN' von MySQL bei leeren Unterabfragen fehl?

Warum schlägt „NOT IN' von MySQL bei leeren Unterabfragen fehl?

Linda Hamilton
Freigeben: 2024-12-29 15:48:12
Original
744 Leute haben es durchsucht

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

MySQL-Abfrage „NOT IN“ für drei Tabellen

In Ihre Abfrage haben Sie die Bedingung Grade.ID_Courses NOT IN ( SELECT ID_Courses FROM Evaluation WHERE NAME='JOHN' and Year=1), um Zeilen aus der Notentabelle herauszufiltern die in der Auswertungstabelle nicht mit denselben Werten für NAME und Jahr vorhanden sind. Wenn der Name „JOHN“ jedoch nicht in der Auswertungstabelle vorhanden ist, erzeugt die Abfrage keine Ausgabe.

Warum NICHT IN problematisch sein kann

Eine Einschränkung Der Hauptgrund für die Verwendung von NOT IN bei Unterabfragen ist die Anfälligkeit für Inkonsistenzen, wenn eine der Unterabfragen NULL-Werte enthält. Dies liegt daran, dass SQL eine dreiwertige Logik verwendet, wobei NULL einen unbekannten oder fehlenden Wert darstellt. Wenn NOT IN auf eine Unterabfrage angewendet wird, die möglicherweise NULL-Werte enthält, können die Ergebnisse unvorhersehbar oder falsch werden.

Alternativen zu NOT IN

Um diese Probleme zu mildern , wird empfohlen, die Verwendung von NOT IN bei Unterabfragen zu vermeiden, die möglicherweise NULL-Werte enthalten. Stattdessen können zuverlässigere Alternativen wie NOT EXISTS oder explizite Joins verwendet werden.

Sie könnten Ihre Abfrage beispielsweise mit dem NOT EXISTS-Operator wie folgt umschreiben:

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;
Nach dem Login kopieren

Verwendung expliziter Joins anstelle der WHERE-Klausel, wie in der bereitgestellten Lösung vorgeschlagen, kann auch die Leistung und Lesbarkeit Ihrer Abfrage verbessern.

Das obige ist der detaillierte Inhalt vonWarum schlägt „NOT IN' von MySQL bei leeren Unterabfragen fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage