Lass uns nochmal durchgehen, wie die Ausführungsreihenfolge in SQL aussieht und womit WHERE und HAVING jeweils arbeiten können oder eben nicht. Das ist ein wichtiger Punkt, auf dem viele Feinheiten bei SQL-Queries aufbauen. Du solltest das wirklich gut verstehen.
Was ist also der Unterschied zwischen WHERE und HAVING, wann benutzt man das eine, wann das andere und wie hängen sie zusammen? Das hilft dir, nicht in der Logik der Abfragen durcheinander zu kommen und Daten effektiv zu filtern. Lass uns unser Wissen zu WHERE und HAVING zusammenfassen.
Was ist WHERE?
WHERE ist eine Bedingung, die verwendet wird, um Zeilen vor der Gruppierung oder Anwendung von Aggregatfunktionen zu filtern. Das heißt, zuerst werden aus der Tabelle die Zeilen ausgewählt, die den Kriterien entsprechen, und erst danach wird auf den verbleibenden Daten gruppiert.
👉 Stell dir vor, du sammelst Obst auf dem Markt. WHERE ist der Filter, mit dem du schon vorher die schlechten Äpfel aussortierst, bevor du sie nach Größe oder Farbe sortierst.
Beispiel:
SELECT *
FROM students
WHERE age > 18;
Diese Abfrage wählt alle Studenten über 18 Jahre bevor irgendwelche anderen Operationen ausgeführt werden.
Was ist HAVING?
HAVING ist ein Filter, der nach der Gruppierung der Daten (GROUP BY) angewendet wird. Damit kannst du Bedingungen auf die gruppierten Daten anwenden, zum Beispiel nur die Gruppen behalten, in denen der Durchschnitt der Noten über 80 liegt.
👉 Wieder das Beispiel mit den Äpfeln. HAVING ist der Filter, den du benutzt, nachdem du die Äpfel schon in Körbe (Gruppen) sortiert hast. Jetzt interessieren dich zum Beispiel nur die Körbe (Gruppen), in denen mehr als zehn Äpfel liegen.
Beispiel:
SELECT korb, COUNT(*)
FROM aepfel
GROUP BY korb
HAVING COUNT(*) > 10;
Diese Abfrage wählt nur die Körbe aus, in denen mehr als 10 Äpfel liegen.
Hauptunterschiede:
| Besonderheit | WHERE |
HAVING |
|---|---|---|
| Anwendung | Filtert Zeilen vor der Gruppierung | Filtert Gruppen nach der Gruppierung |
| Arbeiten mit Aggregation | Aggregatfunktionen dürfen nicht verwendet werden | Aggregatfunktionen dürfen verwendet werden |
| Ziel | Entfernt unnötige Zeilen für die Gruppierung | Entfernt Gruppen, die die Bedingung nicht erfüllen |
Reihenfolge von WHERE, GROUP BY und HAVING
Um besser zu verstehen, wie WHERE und HAVING funktionieren, schauen wir uns die Ausführungsreihenfolge von SQL-Queries an:
- Zuerst wird
FROMausgeführt, die Zeilen werden aus der Tabelle ausgewählt. - Dann wird
WHEREangewendet, es werden nur die Zeilen gefiltert, die die Bedingungen erfüllen. - Danach erfolgt die Gruppierung mit
GROUP BY. Wir bekommen eine neue Tabelle mit Gruppendaten. HAVINGwird angewendet, Gruppen werden gefiltert, die die Bedingungen erfüllen.- Am Ende werden die Ergebnisse mit
SELECTausgewählt.
Schematisch sieht das so aus:
1. FROM → 2. WHERE → 3. GROUP BY → 4. HAVING → 5. SELECT
Beispiel:
SELECT department, AVG(age) AS avg_age
FROM students
WHERE age > 18
GROUP BY department
HAVING AVG(age) > 20;
Hier passiert Folgendes:
- In der Tabelle
studentswerden die Zeilen ausgewählt, woage > 18(WHEREwird benutzt). - Die übrigen Zeilen werden nach
departmentgruppiert. - Für jede Gruppe wird das Durchschnittsalter berechnet.
- Gruppen, in denen das Durchschnittsalter kleiner oder gleich 20 ist, werden durch
HAVINGausgeschlossen. - Die Ergebnisse werden ausgegeben.
Beispiele für die kombinierte Verwendung
Beispiel 1: Filtern vor und nach der Gruppierung
Bedingung: Finde die Fachbereiche, in denen es mehr als 5 Studenten gibt, wobei nur Studenten über 18 Jahre berücksichtigt werden.
Ursprungstabelle students
| id | name | department | age | gpa |
|---|---|---|---|---|
| 1 | Alex Lin | ComputerSci | 20 | 3.8 |
| 2 | Maria Chi | Math | 22 | 3.5 |
| 3 | Anna Song | ComputerSci | 19 | 4.0 |
| 4 | Otto Art | Math | 17 | 3.9 |
| 5 | Liam Park | Physics | 21 | 3.7 |
| 6 | Jane Doe | ComputerSci | 23 | 3.6 |
| 7 | Tom Brown | Math | 25 | 3.4 |
| 8 | Sara White | Math | 19 | 3.8 |
| 9 | John Smith | ComputerSci | 20 | 3.7 |
| 10 | Emily Green | Physics | 18 | 3.9 |
| 11 | Mark Blue | ComputerSci | 21 | 3.5 |
| 12 | Zoe Black | Math | 22 | 3.6 |
| 13 | Max Gray | ComputerSci | 20 | 3.9 |
| 14 | Eva Gold | Math | 23 | 3.7 |
| 15 | Nick Silver | Physics | 19 | 3.8 |
Abfrage:
SELECT department, COUNT(*) AS student_count
FROM students
WHERE age > 18
GROUP BY department
HAVING COUNT(*) > 5;
Ergebnis: -- Ergebnis der Abfrage
| department | student_count |
|---|---|
| ComputerSci | 6 |
Erklärung:
- Zuerst entfernen wir die Zeilen, wo
age <= 18(WHERE-Bedingung). - Wir gruppieren die Daten nach Fachbereichen (
GROUP BY department). - Wir berechnen die Anzahl der Studenten in jeder Gruppe.
- Wir entfernen Gruppen, in denen es weniger oder gleich 5 Studenten gibt (
HAVING COUNT(*) > 5).
Beispiel 2: Fehler bei der Verwendung von WHERE statt HAVING
Bedingung: Finde Fachbereiche, in denen das Durchschnittsalter über 22 Jahre liegt.
Falsche Abfrage:
SELECT department, AVG(age) AS avg_age
FROM students
WHERE AVG(age) > 22
GROUP BY department;
Fehler: SQL erlaubt keine Aggregatfunktionen wie AVG in WHERE, weil die Aggregate zu diesem Zeitpunkt noch nicht berechnet wurden.
Korrekte Abfrage:
SELECT department, AVG(age) AS avg_age
FROM students
GROUP BY department
HAVING AVG(age) > 22;
Hier wird die Bedingung AVG(age) > 22 nach der Gruppierung angewendet.
Praxistipps
Wenn du Zeilen filtern willst, benutze WHERE. Beispiel: Finde alle Mitarbeiter mit einem Gehalt über 5000.
SELECT *
FROM employees
WHERE salary > 5000;
Wenn du Gruppen filtern willst, benutze HAVING. Beispiel: Finde Abteilungen mit einem Gesamtgehalt über 100.000.
SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department
HAVING SUM(salary) > 100000;
Kombiniere WHERE und HAVING für komplexe Bedingungen.
Beispiel: Finde Länder mit mehr als 10 Millionen Einwohnern, wobei nur Städte mit mehr als 1 Million Einwohnern berücksichtigt werden.
SELECT country, SUM(population) AS total_population
FROM cities
WHERE population > 1000000
GROUP BY country
HAVING SUM(population) > 10000000;
Typische Fehler und wie du sie löst
Einer der häufigsten Fehler ist die Verwechslung von WHERE und HAVING. Zum Beispiel der Versuch, eine Aggregatfunktion in WHERE zu verwenden:
SELECT department, COUNT(*)
FROM students
WHERE COUNT(*) > 10
GROUP BY department;
So eine Abfrage führt zu einem Fehler, weil Aggregatberechnungen im WHERE-Schritt noch nicht verfügbar sind. Der richtige Weg ist, HAVING zu verwenden:
SELECT department, COUNT(*)
FROM students
GROUP BY department
HAVING COUNT(*) > 10;
Ein weiterer Fehler ist die falsche Bedingung im WHERE. Zum Beispiel:
SELECT department, AVG(age) AS avg_age
FROM students
WHERE avg_age > 20
GROUP BY department;
Hier ist die Bedingung avg_age > 20 falsch, weil avg_age noch nicht berechnet wurde. Die Lösung: Diese Bedingung in HAVING verschieben:
SELECT department, AVG(age) AS avg_age
FROM students
GROUP BY department
HAVING AVG(age) > 20;
Ich hoffe, du hast jetzt ein klares Verständnis davon, was WHERE und HAVING unterscheidet, wie du sie richtig einsetzt und wie du typische Fehler vermeidest. Dieses Wissen brauchst du beim Erstellen von komplexen Reports, beim Filtern von Daten für Analysen und beim Optimieren von Abfragen. Also für mehr als die Hälfte aller echten SQL-Queries, die du schreiben wirst :)
GO TO FULL VERSION