0Pricing
SQL Academy · Lektion

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 orders

WHERE 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:

  1. FROM – Tabellen auswählen und verknüpfen
  2. WHERE – Zeilen filtern
  3. GROUP BY – Gruppen bilden
  4. HAVING – Gruppen filtern
  5. SELECT – Spalten auswählen
  6. ORDER BY – sortieren
  7. LIMIT – 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 1M

Aliase 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 / MySQL

HAVING 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

  1. COUNT, SUM, AVG, MIN, MAX
  2. GROUP BY mit einer oder mehreren Spalten
  3. HAVING vs. WHERE
  4. Häufige Fehler: NULL-Werte in Aggregaten
← Zurück zu SQL Academy