Heim > Datenbank > MySQL-Tutorial > Warum NOT EXISTS oder explizite Verknüpfungen anstelle von NOT IN in SQL-Abfragen verwenden?

Warum NOT EXISTS oder explizite Verknüpfungen anstelle von NOT IN in SQL-Abfragen verwenden?

Susan Sarandon
Freigeben: 2025-01-03 21:15:08
Original
266 Leute haben es durchsucht

Why Use NOT EXISTS or Explicit Joins Instead of NOT IN in SQL Queries?

Die Gefahren von „NOT IN“ in SQL-Abfragen

Beim Versuch einer Abfrage, die prüft, ob Daten aus einer Tabelle in einer anderen nicht vorhanden sind , kann der „NOT IN“-Operator zu unerwarteten Ergebnissen führen, insbesondere bei der Verarbeitung von Nullwerten.

Das Problem mit „NOT IN“

In der bereitgestellten Abfrage vergleicht die „NOT IN“-Klausel die Ergebnisse einer Unterabfrage mit der Spalte „ID_Courses“ in der Tabelle „Grade“:

Grade.ID_Courses NOT IN (SELECT ID_Courses FROM Evaluation WHERE NAME='JOHN' and Year=1)
Nach dem Login kopieren

Wenn die Unterabfrage Nullwerte zurückgibt, wird die „NOT IN“-Klausel als „false“ ausgewertet, selbst wenn der angegebene „JOHN“-Datensatz mit „Jahr“ 1 in der vorhanden ist Tabelle „Noten“. Dies liegt daran, dass die dreiwertige Logik in SQL Null als „unbekannt“ interpretiert, was zu einer falschen Auswertung führt.

Alternativen zu „NOT IN“

Um dieses Problem zu vermeiden , wird empfohlen, alternative Methoden wie NOT EXISTS oder explizite Joins zu verwenden:

NOT EXISTIERT

SELECT Grade.ID_Courses, Course.ID_Courses, Grade.NAME, 
    Course.NAME, Grade.ID_Courses,
    Evaluation.NAME,
    Evaluation.Year,    
    Grade.Year
    from Grade
    LEFT 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 
    Evaluation.NAME IS NULL
    GROUP BY Grade.ID_Courses
Nach dem Login kopieren

Explizite Verknüpfungen

SELECT Grade.ID_Courses, Course.ID_Courses, Grade.NAME, 
    Course.NAME, Grade.ID_Courses,
    Evaluation.NAME,
    Evaluation.Year,    
    Grade.Year
    from Grade
    LEFT 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 
    NOT (Evaluation.NAME IS NOT NULL)
    GROUP BY Grade.ID_Courses
Nach dem Login kopieren

Durch die Verwendung dieser Alternativen können Sie sicherstellen, dass die Abfrage Datensätze genau identifiziert, bei denen die angegebenen Daten dies nicht tun in der anderen Tabelle vorhanden sind, unabhängig vom Vorhandensein von Nullwerten.

Das obige ist der detaillierte Inhalt vonWarum NOT EXISTS oder explizite Verknüpfungen anstelle von NOT IN in SQL-Abfragen verwenden?. 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