HAVING oder WHERE
Vor oder nach der Gruppierung filtern und erkennen, welche Klausel das Aggregat sieht
HAVING oder WHERE ist eine kostenlose Coding Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Coding Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Die Frage, die Ihnen gestellt wird
„Was ist der Unterschied zwischen WHERE und HAVING?“ ist eine der häufigsten Fragen in SQL-Interviews. Eine schwache Antwort lautet: „HAVING ist für Aggregate.“ Eine überzeugende Antwort erklärt, wann jede Klausel ausgeführt wird in der Abfragepipeline.
Dieser zeitliche Ablauf ist der entscheidende Punkt: WHERE filtert Zeilen vor der Gruppierung; HAVING filtert Gruppen nach der Aggregation.
Ihre Position in der Ausführungsreihenfolge
Rufen Sie sich die logische Ausführungsreihenfolge einer Abfrage in Erinnerung:
FROM/JOIN→ die Zeilenmenge erstellenWHERE→ einzelne Zeilen filternGROUP BY→ zu Gruppen zusammenfassenHAVING→ die Gruppen filternSELECT→ Spalten auswählenORDER BY→ sortieren
WHERE wird ausgeführt, bevor Gruppen existieren; HAVING wird danach ausgeführt. Deshalb kann HAVING Aggregate sehen, WHERE jedoch nicht.
WHERE kann Aggregate nicht sehen
Da WHERE vor der Gruppierung ausgeführt wird, liegen zu diesem Zeitpunkt noch keine Aggregatwerte vor. WHERE COUNT(*) > 5 zu schreiben, ist in jeder standardkonformen Datenbank ein Syntaxfehler.
Interviewer bauen genau diese Zeile gern ein, um zu prüfen, ob Sie die Abfragepipeline verstehen. Das Aggregat existiert noch nicht, wenn WHERE ausgewertet wird.
-- ERROR: aggregate not allowed in WHERE
SELECT department, COUNT(*)
FROM employees
WHERE COUNT(*) > 5
GROUP BY department;HAVING filtert die Gruppen
Verschieben Sie die Aggregatbedingung nach HAVING, dann funktioniert sie, weil HAVING ausgeführt wird, nachdem die Gruppen und ihre Aggregate berechnet wurden.
Lesen Sie die Abfrage so: „Gruppieren Sie die Mitarbeiter und behalten Sie anschließend nur Abteilungen, deren Anzahl größer als fünf ist.“
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;Zeilenfilter gehören in WHERE
Der umgekehrte Fehler besteht darin, Rohzeilen in HAVING zu filtern. Das liefert oft das richtige Ergebnis, ist aber langsamer und irreführend, weil Sie Zeilen gruppiert haben, die Sie eigentlich verwerfen wollten.
Als Faustregel gilt: Filtern Sie nach einem Rohspaltenwert → WHERE. Filtern Sie nach einem Aggregat → HAVING. Durch frühes Filtern der Zeilen wird die Datenmenge verkleinert, die von der Gruppierung verarbeitet werden muss.
-- Better: drop inactive rows BEFORE grouping
SELECT department, COUNT(*) AS headcount
FROM employees
WHERE status = 'active'
GROUP BY department
HAVING COUNT(*) > 5;Beide Klauseln zusammen
Eine vollständige Abfrage verwendet häufig beide Klauseln. WHERE schränkt zuerst die Zeilen ein; HAVING behält anschließend die passenden Gruppen. Das Lesen von oben nach unten entspricht der logischen Reihenfolge.
Durchgearbeitetes Beispiel: Finden Sie unter den in diesem Jahr aufgegebenen Bestellungen die Kunden, die insgesamt mehr als 1000 ausgegeben haben.
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY customer_id
HAVING SUM(amount) > 1000;HAVING für nicht aggregierte Spalten
HAVING kann auf eine Gruppierungsspalte verweisen, nicht nur auf Aggregate. HAVING department = 'Sales' ist zulässig, aber nutzlos: Diese Filterbedingung gehört in WHERE, damit sie früher ausgeführt wird.
Wenn ein Interviewer Ihnen ein HAVING zeigt, das eine einfache gruppierte Spalte filtert, lautet die erwartete Kritik: „Verschieben Sie es aus Effizienzgründen nach WHERE.“
-- Works but inefficient; prefer WHERE department = 'Sales'
SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING department = 'Sales';HAVING ohne GROUP BY
Ein subtiler Fall: HAVING ist auch ohne GROUP BY zulässig. Die gesamte Tabelle wird zu einer einzigen impliziten Gruppe, und HAVING filtert diese eine Gruppe.
Ist die Aggregatbedingung falsch, erhalten Sie keine Zeilen; ist sie wahr, erhalten Sie eine Zeile. Das ist selten nützlich, wird aber in Interviews gefragt, um zu prüfen, ob Sie das Konzept der impliziten Gruppe verstehen.
-- Returns the count only if the table has > 100 rows
SELECT COUNT(*) AS total
FROM orders
HAVING COUNT(*) > 100;Kann HAVING einen SELECT-Alias verwenden?
Wie beim Alias-Gültigkeitsbereich an anderer Stelle unterscheiden sich die Dialekte. Postgres und MySQL erlauben es HAVING, auf einen SELECT-Alias zu verweisen; SQL Server und Oracle tun dies nicht.
Portabel ist es, den Aggregatausdruck in HAVING zu wiederholen. Das funktioniert in jeder Engine und vermeidet Überraschungen in einem datenbankübergreifenden Interview.
-- Portable: repeat the aggregate, do not rely on the alias
SELECT region, SUM(amount) AS total
FROM sales
GROUP BY region
HAVING SUM(amount) > 5000;Leistungsaspekte
Wenn Sie besonders überzeugen möchten, verknüpfen Sie die Klauseln mit der Leistung: WHERE reduziert die Anzahl der Zeilen, die die Gruppierungs-Engine durchsuchen muss, und kann Indizes verwenden; HAVING wird auf bereits aggregierte Gruppen angewendet und kann daher die Kosten der Gruppierung nicht reduzieren.
Die Botschaft, die Interviewer hören möchten, lautet: Verschieben Sie jeden Filter so weit wie möglich nach vorn. Nur Bedingungen, die tatsächlich von einem Aggregat abhängen, benötigen HAVING.
Die Antwort in einem Satz
Merken Sie sich dies für das Interview: „WHERE filtert Zeilen vor der Gruppierung und kann Aggregate nicht sehen; HAVING filtert Gruppen nach der Aggregation und ist die einzige Klausel, die einen Aggregatwert prüfen kann.“
Fügen Sie anschließend die Liste der Ausführungsreihenfolge hinzu, und Sie haben eine vollständige, nach Erfahrung klingende Antwort gegeben.
Kurzer Test
Entscheiden Sie, in welche Klausel die jeweilige Bedingung gehört.
Zusammenfassung
WHERE: filtert Zeilen vor GROUP BY; Aggregate sind nicht zulässig. HAVING: filtert Gruppen nach der Aggregation und ist die einzige Stelle, an der eine Aggregatbedingung zulässig ist.
- Platzieren Sie Filter für Rohspalten in WHERE, um eine bessere Geschwindigkeit und Indexnutzung zu erreichen.
- HAVING kann auf gruppierte Spalten verweisen, sollte dies bei einfachen Filtern aber nicht tun.
- HAVING funktioniert ohne GROUP BY auf der impliziten Gruppe der gesamten Tabelle.
- Wiederholen Sie Aggregatausdrücke in HAVING, um die Abfrage zwischen Dialekten portabel zu halten.
Häufig gestellte Fragen
Ist die Lektion „HAVING oder WHERE“ kostenlos?
Ja — der vollständige Text von „HAVING oder WHERE“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Coding Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „HAVING oder WHERE“?
Vor oder nach der Gruppierung filtern und erkennen, welche Klausel das Aggregat sieht Du übst Coding Interview Prep mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Coding Interview Prep zu starten?
Keine Vorkenntnisse erforderlich. Coding Interview Prep auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „HAVING oder WHERE“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Coding Interview Prep-Lektion Code schreiben und ausführen?
Ja. Jede Coding Interview Prep-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Die GROUP-BY-Regel für SELECT-Spalten
- HAVING oder WHERE
- Nach mehreren Spalten und Ausdrücken gruppieren
- Gruppen zählen und filtern