SQL-Datenfilterung: Unterschiede zwischen WHERE- und HAVING-Klauseln
Die HAVING- und WHERE-Klauseln in SQL werden beide zum Filtern von Daten verwendet, ihre Funktionen sind jedoch unterschiedlich. Die WHERE-Klausel funktioniert für einzelne Zeilen, während die HAVING-Klausel für aggregierte Ergebnisse funktioniert.
Differenzbeispiel
Angenommen, wir haben zwei Tabellen: Lecturers
und Lecturers_Specialization
und möchten die Dozenten mit den meisten Fachgebieten finden.
Die erste Abfrage mit der WHERE-Klausel liefert nicht die erwarteten Ergebnisse:
<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>
Das liegt daran, dass die WHERE-Klausel eine einzelne Zeile filtert und der COUNT(S.Expertise) >= ALL
-Vergleich nicht auf eine einzelne Zeile angewendet werden kann.
Die richtige Abfrage verwendet 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>
HAVING-Klausel wirkt sich auf die aggregierten Ergebnisse aus, um sicherzustellen, dass der Vergleich auf die Anzahl der Fachgebiete jedes Dozenten angewendet wird.
Faustregeln und Optimierung
Im Allgemeinen wird die WHERE-Klausel vor der GROUP BY-Klausel verwendet, um einzelne Zeilen zu filtern. Die HAVING-Klausel wird nach der GROUP BY-Klausel verwendet, um aggregierte Ergebnisse zu filtern.
Darüber hinaus können Abfragen mithilfe der ANSI JOIN-Syntax anstelle der L, S θ-Join-Syntax optimiert werden:
<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>
Das obige ist der detaillierte Inhalt vonSQL HAVING vs. WHERE: Wann werden die einzelnen Klauseln zur Datenfilterung verwendet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!