Unterschiede zwischen HAVING- und WHERE-Klauseln in SQL-Aggregatabfragen
Bei der Arbeit mit aggregierten Daten ist es wichtig, den Unterschied zwischen HAVING- und WHERE-Klauseln zu verstehen. Dieser Artikel befasst sich mit einem häufigen Abfrageszenario und erklärt, warum eine Methode die richtigen Ergebnisse zurückgibt und eine andere nicht.
Abfragekontext
Angesichts der folgenden Tabelle:
Ziel ist es, den Lehrer mit den meisten Spezialitäten zu finden.
Fehlgeschlagener Versuch, die WHERE-Klausel zu verwenden
Fehlgeschlagene Abfrageversuche, die WHERE-Klausel zu verwenden, um die Ergebnisse basierend auf der Anzahl der Hauptfächer zu filtern:
<code class="language-sql">SELECT L.LectID, Fname, Lname FROM Lecturers L, Lecturers_Specialization S WHERE L.LectID = S.LectID AND COUNT(S.Expertise) >= ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID);</code>
Diese Abfrage lieferte nicht die erwarteten Ergebnisse, da die WHERE-Klausel nicht zum Anwenden von Bedingungen auf Aggregatwerte geeignet ist.
Erfolgreiche Abfrage mit HAVING-Klausel
Erfolgreiche Abfragen verwenden stattdessen die HAVING-Klausel:
<code class="language-sql">SELECT L.LectID, Fname, Lname FROM Lecturers L, Lecturers_Specialization S WHERE L.LectID = S.LectID GROUP BY L.LectID, Fname, Lname HAVING COUNT(S.Expertise) >= ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID);</code>
Die Gründe, warum HAVING erfolgreich ist
HAVING-Klausel wird speziell zum Filtern der Ergebnisse aggregierter Abfragen verwendet. Nach der Operation „GROUP BY“ wird eine Bedingung angewendet, die es uns ermöglicht, die Anzahl der Hauptfächer für jeden Dozenten zu überprüfen.
Faustregel
Im Allgemeinen verwenden Sie WHERE vor GROUP BY, um einzelne Zeilen zu filtern, und HAVING nach GROUP BY, um aggregierte Ergebnisse zu filtern.
Verbesserte Abfrage mit ANSI JOIN
Eine alternative Abfrageversion mit ANSI JOIN-Syntax wird ebenfalls bereitgestellt:
<code class="language-sql">SELECT L.LectID, Fname, Lname FROM Lecturers L JOIN Lecturers_Specialization S ON L.LectID=S.LectID GROUP BY L.LectID, Fname, Lname HAVING COUNT(S.Expertise)>=ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID)</code>
Diese Version eliminiert die Verwendung von WHERE für Join-Bedingungen und verwendet stattdessen JOIN.
Das obige ist der detaillierte Inhalt vonHAVING vs. WHERE in SQL: Wann sollte ich die einzelnen Klauseln für die Aggregation verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!