HAVING vs. WHERE
Unterscheiden Sie HAVING (filtert Gruppen) von WHERE (filtert Zeilen) und wenden Sie beide korrekt in derselben Abfrage an.
HAVING vs. WHERE ist eine kostenlose SQL Academy-Lektion auf CoddyKit. Dies ist Lektion 3 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 SQL Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Zwei Filterstufen
WHERE filtert einzelne Zeilen VOR der Gruppierung. HAVING filtert Gruppen NACH der Aggregation. Die beiden Klauseln sehen ähnlich aus, arbeiten aber in unterschiedlichen Stufen.
Beispiel für WHERE
WHERE filtert Rohzeilen. Aggregate sind dort nicht verfügbar:
-- Sum totals for rows where status is 'paid':
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY user_id;Beispiel für HAVING
HAVING filtert Gruppen. Dort können Sie auf Aggregate verweisen:
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5; -- only users with ≥ 5 ordersWHERE und HAVING kombinieren
Beide Klauseln können in derselben Abfrage vorkommen:
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE created_at >= NOW() - INTERVAL '90 days'
GROUP BY user_id
HAVING SUM(total) > 1000;Aggregate gehören nicht in WHERE
Der Abfrageplaner führt WHERE vor der Gruppierung aus – Aggregate sind zu diesem Zeitpunkt noch nicht verfügbar:
-- WRONG:
SELECT user_id, COUNT(*) FROM orders
WHERE COUNT(*) > 5 -- ERROR
GROUP BY user_id;
-- RIGHT — move to HAVING:
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5;Prädikate nach Möglichkeit in WHERE verschieben
WHERE filtert vor der Gruppierung, sodass weniger Zeilen in die Aggregation gelangen. Verwenden Sie HAVING nur für Bedingungen, die sich nicht in WHERE ausdrücken lassen.
-- Slightly slower (filters after grouping):
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING user_id IN (1,2,3);
-- Faster (filters before grouping):
SELECT user_id, COUNT(*) FROM orders
WHERE user_id IN (1,2,3)
GROUP BY user_id;Logische Ausführungsreihenfolge
Konzeptionelle Reihenfolge:
FROM– Tabellen auswählen und verknüpfenWHERE– Zeilen filternGROUP BY– Gruppen bildenHAVING– Gruppen filternSELECT– Spalten auswählenORDER BY– sortierenLIMIT– die ersten N Zeilen
HAVING ohne GROUP BY
Sie können HAVING ohne GROUP BY verwenden – die gesamte Tabelle wird zu einer Gruppe:
SELECT SUM(total) FROM orders
HAVING SUM(total) > 1000000; -- prints only if total over 1MAliase in HAVING
Einige Datenbanken erlauben es, in HAVING auf SELECT-Aliase zu verweisen; PostgreSQL und MySQL unterstützen dies, Standard-SQL jedoch nicht. Am portabelsten ist es, das Aggregat zu wiederholen:
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5; -- portable
-- HAVING order_count >= 5 -- works in PG / MySQLHAVING mit mehreren Aggregaten
Verwenden Sie HAVING für zusammengesetzte Bedingungen mit Aggregaten:
SELECT user_id, COUNT(*) AS orders, SUM(total) AS revenue
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5 AND SUM(total) > 1000;Hinweis zur Performance
Ein Aggregatfilter in HAVING kann Indizes nicht so nutzen wie ein WHERE-Filter auf einer Spalte. Verschieben Sie möglichst viel nach WHERE.
Zusammenfassung
WHERE = Zeilen filtern. HAVING = Gruppen filtern.
- Aggregate nur in HAVING, niemals in WHERE
- Prädikate für bessere Geschwindigkeit nach WHERE verschieben
- Bei Bedarf beide Klauseln verwenden
Kurze Verständnisprüfung
Sie möchten Benutzer finden, die mehr als 10 Bestellungen aufgegeben haben. Welche Klausel filtert danach?
Häufig gestellte Fragen
Ist die Lektion „HAVING vs. WHERE“ kostenlos?
Ja — der vollständige Text von „HAVING vs. 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 SQL Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „HAVING vs. WHERE“?
Unterscheiden Sie HAVING (filtert Gruppen) von WHERE (filtert Zeilen) und wenden Sie beide korrekt in derselben Abfrage an. Du übst SQL Academy 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 SQL Academy zu starten?
Keine Vorkenntnisse erforderlich. SQL Academy 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 3 von 4.
Wie lange dauert die Lektion „HAVING vs. 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 SQL Academy-Lektion Code schreiben und ausführen?
Ja. Jede SQL Academy-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
- COUNT, SUM, AVG, MIN, MAX
- GROUP BY mit einer oder mehreren Spalten
- HAVING vs. WHERE
- Häufige Fehler: NULL-Werte in Aggregaten