Kurs
Der Unterschied zwischen WHERE und HAVING in SQL
WHERE
und HAVING
sind zwei wichtige Klauseln in SQL. Egal, ob du sehr fortgeschrittene oder sehr einfache Abfragen schreibst, du wirst beides verwenden müssen. Du kannst dir WHERE
und HAVING
wie Geschwister vorstellen. Sie haben beide eine ähnliche Funktion (Filtern) und treten oft zusammen auf. Aber genau wie Geschwister haben sie unterschiedliche Eigenschaften und einzigartige Rollen.
Wenn du gerade dabei bist, WHERE
und HAVING
zu sortieren, empfehle ich dir, dich für unseren Lernpfad zu den SQL-Grundlagen anzumelden, der ein guter und umfassender Ausgangspunkt ist. Du lernst etwas über die verschiedenen SQL-Klauseln, die Ausführungsreihenfolge von SQL, die Optimierung von SQL-Abfragen und viele andere wichtige Dinge.
Die kurze Antwort: WO gegen. HABEN
Die kurze Antwort und die Quelle der Verwirrung für viele Leute ist, dass WHERE
mit Daten auf Zeilenebene arbeitet, während HAVING
mit gruppierten Daten arbeitet. Hier ist ein Leitfaden:
-
WHERE
filtert Zeilen, bevor eine Gruppierung oder Aggregation stattfindet. Sie gilt für einzelne Zeilen und kann nicht mit Aggregatfunktionen verwendet werden. -
HAVING
filtert Gruppen, nachdem die Gruppierung und Aggregation durchgeführt wurde. Sie gilt für die Ergebnisse von Aggregatfunktionen und wird in Kombination mitGROUP BY
verwendet.
Ein kurzes Beispiel, um den Unterschied zu verdeutlichen
Schauen wir uns ein kurzes Beispiel an. Wenn du deinen eigenen Arbeitsablauf nachvollziehen möchtest, kannst du den Datensatz für die Immobilienvermietung von diesem GitHub-Repository herunterladen.
Nehmen wir an, wir müssen alle Immobilien in unserem Datensatz zurückgeben, die einen Mietpreis von weniger als 500 US-Dollar haben. Die Detailstufe jeder Zeile im Datensatz (eine Eigenschaft pro Zeile) entspricht der Detailstufe der Abfragebedingung. Deshalb verwenden wir WHERE
in der folgenden Abfrage:
SELECT *
FROM rentals
WHERE rental_price < 500
Das Ergebnis würde wie folgt aussehen. Beachte, dass 118 Zeilen zurückgegeben werden.
Einfache Zeilenfilterung mit WHERE. Bild vom Autor.
Nehmen wir nun an, wir wollen keine Tabelle mit Immobilien, sondern mit Städten, in denen der durchschnittliche Mietpreis unter 2.700 $ liegt. Anstatt jede Zeile einer Immobilie zuzuordnen, werden wir die Zeilen gruppieren und den Mietpreis zu einem durchschnittlichen Mietpreis für jede Stadt zusammenfassen. Deshalb verwenden wir HAVING
, wie in dieser Abfrage:
SELECT city, AVG(rental_price) AS average_rent
FROM rentals
GROUP BY city
HAVING AVG(rental_price) < 2700;
Und das Ergebnis wäre. Beachte, dass es nur ein Ergebnis gibt.
Einfache Gruppenfilterung mit HAVING. Bild vom Autor.
WHERE, HAVING und die Reihenfolge der SQL-Ausführung
Wir sehen, dass WHERE
mit Filtern auf Zeilenebene arbeitet, während HAVING
mit Filtern auf Aggregatebene arbeitet. Wenn wir diesen Unterschied verstehen, können wir auch etwas über die Reihenfolge der Ausführung von SQL-Klauseln lernen.
WHERE
wird vor GROUP BY
und direkt nach FROM
(und JOIN
, falls vorhanden) ausgewertet; es kann keine Gruppierung oder Aggregation vornehmen. WHERE
kommt ins Spiel, bevor eine Aggregation vorgenommen wird. Deshalb arbeitet sie nur mit Daten auf Zeilenebene.
In der Zwischenzeit kommt HAVING
nach der Ausführung der GROUP BY
Klausel. Das bedeutet, dass sie ins Spiel kommt, nachdem die Tabelle transformiert und auf einer anderen Ebene gruppiert wurde als die Granularität der Ausgangstabelle. HAVING
arbeitet mit der neuen, transformierten Version der Tabelle.
Wie man die WHERE-Klausel in SQL verwendet
Gehen wir einen Schritt zurück und schauen wir uns jede Klausel einzeln an. Wir können mit der WHERE
Klausel beginnen.
WHERE-Syntax und Anweisungen
WHERE
kann in drei verschiedenen SQL-Anweisungen verwendet werden: SELECT
, UPDATE
, und DELETE
.
WHERE in SELECT-Anweisungen
In SELECT
Anweisungen, die zum Abrufen von Daten aus der Datenbank verwendet werden, spielt WHERE
eine direkte Rolle beim Filtern auf Zeilenebene und hat seinen bekannten Platz direkt nach der FROM
Klausel, wie wir in der folgenden Abfrage sehen können:
SELECT column1, column2… etc.
FROM table_name
WHERE condition;
WHERE
in Verbindung mit SELECT
ist die Stelle, an der die Klausel WHERE
am häufigsten mit HAVING
verwechselt wird.
WHERE in UPDATE-Anweisungen
Darüber hinaus spielt WHERE
eine wichtige Rolle in UPDATE
Anweisungen, um die Zeile zu bestimmen, in der die Datenaktualisierung stattfinden soll, wie wir an der folgenden Syntax sehen können:
UPDATE table_name
SET column_name1 = value1, column_name2 = value2… etc.
WHERE condition;
WHERE in DELETE-Anweisungen
WHERE
ist auch eine nützliche Ergänzung zu den DELETE
Anweisungen, um die Datensätze (Zeilen) zu bestimmen, die gelöscht werden sollen, wie wir hier sehen können:
DELETE FROM table_name
WHERE condition;
Wie man WHERE-Bedingungen schreibt
WHERE
Bedingungen werden als einfacher logischer Ausdruck geschrieben. Sie besteht aus drei Teilen: der Variablen/dem Operanden, der Bedingung und dem Wert/Ergebnis. Werfen wir einen Blick auf die Optionen für die WHERE
Bedingungen, die sowohl Vergleichs- als auch logische Operatoren enthalten.
Bedienerzeichen | Beschreibung | Datentyp des Operanden |
---|---|---|
= | Entspricht (am Datum) | Numerisch, Text, Datum/Zeitstempel, Boolesch |
< | Weniger als (vor Datum) | Numerisch, Datum/Zeitstempel |
> | Größer als (nach Datum) | Numerisch, Datum/Zeitstempel |
<= | Kleiner als oder gleich (am oder vor dem Datum) | Numerisch, Datum/Zeitstempel |
>= | Größer als oder gleich (am oder nach dem Datum) | Numerisch, Datum/Zeitstempel |
<> (!=) | Nicht gleich (nicht am Datum) | Numerisch, Text, Datum/Zeitstempel, Boolesch |
IN | Gleich mehr als einem Wert (an mehreren Daten) | Numerisch, Text, Datum/Zeitstempel, Boolesch (allerdings Unsinn!) |
WIE | Entspricht einem Textmuster (mit Platzhaltern) | Text |
ZWISCHEN | Existiert in einem Bereich | Numerisch, Datum/Zeitstempel |
UND | Kombiniert mehrere Bedingungen, die alle wahr sein müssen | Logisch (boolesch) |
OR | Kombiniert mehrere Bedingungen, von denen mindestens eine wahr sein muss | Logisch (boolesch) |
NICHT | Negiert eine Bedingung | Logisch (boolesch) |
IS NULL | Prüft auf Nullwerte | Alle Datentypen |
IS NOT NULL | Prüft auf Nicht-Null-Werte | Alle Datentypen |
Hier ist ein Beispiel, in dem wir NOT
zusammen mit dem IN
Vergleichsoperator verwenden:
SELECT *
FROM rentals
WHERE city NOT IN ('Cairo', 'Giza');
Die Anweisung liefert alle Grundstücke, die weder in Kairo noch in Gizeh liegen.
Grundstücke außerhalb von Kairo und Gizeh. Bild vom Autor.
WO Anwendungsfälle
Da WHERE
mit den Anweisungen SELECT
, UPDATE
und DELETE
arbeitet, können wir vorhersehen, dass es für drei Anwendungsfälle verwendet werden kann: Filtern auf Zeilenebene, Abrufen von Daten und Datenmanipulation.
Filterung auf Zeilenebene
Wir können unsere Tabellenzeilen nach einer oder mehreren Bedingungen filtern. Die folgende Abfrage filtert die Zeilen so, dass nur Villen-Eigenschaften enthalten sind.
SELECT *
FROM rentals
WHERE type = ‘villa’;
Auswählen von Villen-Eigenschaften. Bild vom Autor.
Datenabruf
WHERE
kann verwendet werden, um einen bestimmten Datenpunkt abzurufen, nach dem wir suchen. Dies ist ähnlich wie das Filtern auf Zeilenebene, aber spezifischer. Angenommen, wir brauchen die ID der Immobilie, die am ersten Januar 2022 in Kairo verfügbar war, dann können wir die folgende Abfrage verwenden:
SELECT property_id
FROM rentals
WHERE available_date = '2022-01-01'
AND city = 'Cairo';
Abrufen eines Datenpunktes. Bild vom Autor.
Datenbearbeitung
Schließlich ist WHERE
ein großartiges Hilfsmittel, um Werte zu ändern und bestimmte Datensätze in deiner Datenbank zu löschen. Wenn wir zum Beispiel herausgefunden haben, dass das Grundstück 171 nicht haustierfreundlich ist, können wir die Spalte pet_friendly
mit WHERE
in einer UPDATE
Anweisung wie folgt ändern:
UPDATE rentals
SET pet_friendly = false
WHERE property_id = 171;
Wie man die HAVING-Klausel in SQL verwendet
Jetzt ist es an der Zeit, sich der HAVING
Klausel in der gleichen Ausführlichkeit zuzuwenden.
HAVING-Syntax und Anweisungen
Zunächst einmal sollten wir wissen, dass die HAVING
Klausel nur in SELECT
Anweisungen verwendet werden kann. Die einzige Syntax, die sie haben kann, ist daher die folgende:
SELECT grouped_column, aggregate_function(aggregated_column)… etc.
FROM table_name
GROUP BY grouped_column
HAVING condition
Beachte, dass du mehr als eine gruppierte Spalte und mehr als eine aggregierte Spalte hinzufügen kannst. Im Folgenden werden wir Beispiele sehen.
Wie man HAVING-Bedingungen schreibt
Wie WHERE
werden auch HAVING
Bedingungen als logische Ausdrücke geschrieben, allerdings mit einer zusätzlichen Komponente, der Aggregationsfunktion. Eine HAVING
Bedingung besteht also aus 1) Aggregatfunktion, 2) Variable/Operand, 3) Vergleichsoperator und 4) Wert/Ergebnis.
Aggregatfunktionen mit HAVING
SQL hat hauptsächlich fünf Aggregatfunktionen und eine sechste, die ein Sonderfall ist. Diese Funktionen sind:
Aggregatfunktion | Geeigneter Datentyp |
---|---|
SUM() | Numerisch |
AVG() | Numerisch |
MIN() | Numerisch, Text, Datum/Zeitstempel |
MAX() | Numerisch, Text, Datum/Zeitstempel |
COUNT() | Numerisch, Text, Datum/Zeitstempel, Boolesch |
Lass uns ein Beispiel ausprobieren. Hier verwenden wir die Funktion COUNT()
mit GROUP BY
, um eine Häufigkeitstabelle zu erstellen, und verwenden die Bedingung HAVING
als Filter. Konkret müssen wir die Städte kennen, die 150 Mal oder weniger erwähnt werden, was in diesem Zusammenhang mit der Anzahl der Anmeldungen zu tun hat. Wir können diese Abfrage verwenden:
SELECT city, COUNT(*) AS properties_count
FROM rentals
GROUP BY city
HAVING COUNT(*) <= 150;
Verwendung von COUNT() mit HAVING. Bild vom Autor.
Vergleich und logische Operatoren
HAVING
akzeptiert alle Vergleichs- und logischen Operatoren, die auch WHERE
akzeptiert. Der einzige Unterschied besteht darin, dass der geeignete Datentyp bei HAVING
in erster Linie von der Aggregatfunktion abhängt, wie wir in der Tabelle oben sehen können.
HAVING Anwendungsfälle
Im Gegensatz zu WHERE
kann HAVING
nicht in den Anweisungen UPDATE
und DELETE
verwendet werden; HAVING
wird nur für die Datenabfrage verwendet. Grob gesagt ergeben sich daraus zwei Szenarien:
Filterung auf Gruppenebene
Dies ist die übliche und normale Verwendung von HAVING
. Ein Beispiel dafür ist, nur Städte zurückzugeben, deren durchschnittliche Mietpreise unter 2.700 $ liegen.
SELECT city, AVG(rental_price) AS avg_price
FROM rentals
GROUP BY city
HAVING AVG(rental_price) < 2700;
Einreihige Filterung
Dies ist ein ungewöhnlicher Fall, aber HAVING
kann verwendet werden, um eine einzeilige Aggregation, wie eine Metrik oder einen KPI, nur dann zurückzugeben, wenn sie eine bestimmte Bedingung erfüllt. Dies kann durch die Nutzung von HAVING
ohne GROUP BY
erreicht werden. Im folgenden Beispiel geben wir den durchschnittlichen Mietpreis nur zurück, wenn er unter 2.800 $ liegt. Wenn die Maßnahme die Bedingung erfüllt, haben wir ein einzeiliges Ergebnis. Andernfalls hätten wir eine leere Tabelle.
SELECT AVG(rental_price) as avg_price
FROM rentals
HAVING AVG(rental_price) > 2800;
WHERE und HAVING kombinieren
WHERE
und HAVING
können kombiniert werden, um Tabellen sowohl vor als auch nach der Aggregation zu filtern. Im folgenden Beispiel geben wir die Anzahl der Immobilien in jeder Stadt zurück, wobei wir nur Immobilien zählen, die haustierfreundlich sind, und nur Städte mit mehr als 80 Immobilien herausfiltern.
SELECT city, COUNT(*) AS number_properties
FROM rentals
WHERE pet_friendly = true
GROUP BY city
HAVING COUNT(*) > 80;
Einfache Kombination aus WHERE und HAVING. Bild vom Autor.
Der Unterschied zwischen WHERE und HAVING in der Leistung
Wir wissen, dass die WHERE
Klausel vor der Gruppierung oder Aggregation angewendet wird. Aber wir sollten auch wissen, dass WHERE
aus diesem Grund effizienter für das Filtern einzelner Zeilen ist, weil es die Anzahl der verarbeiteten Zeilen zu Beginn der Abfrage reduziert.
Auf der anderen Seite wissen wir, dass die HAVING
Klausel nach der Aggregation angewendet wird und die Ergebnismenge auf Basis der gruppierten Daten filtert. Aus diesem Grund ist sie, da sie Daten verarbeitet, nachdem alle Zeilen gruppiert wurden, in der Regel weniger effizient als WHERE
, obwohl sie für Bedingungen mit Aggregatfunktionen immer noch notwendig ist.
Schauen wir uns diese Abfrage an:
SELECT city, COUNT(*)
FROM rentals
GROUP BY city
HAVING rental_price < 2700;
Diese Abfrage ist ineffizient, weil die rental_price
Bedingung nicht von einer Aggregation abhängt - sie filtert einzelne Zeilen. Diese Abfrage gruppiert zunächst alle Mieten nach Städten, zählt sie und filtert dann das Ergebnis, was ineffizient ist, weil es unnötige Zeilen verarbeitet. Aus diesem Grund wäre dies eine schnellere Abfrage gewesen:
SELECT city, COUNT(*)
FROM rentals
WHERE rental_price < 2700
GROUP BY city;
WHERE und HAVING Optimierungstipps
Anhand der vorangegangenen Ausführungen können wir einige bewährte Praktiken erkennen, mit denen wir die Verwendung der Klauseln WHERE
und HAVING
optimieren können. Das ist wichtig, wenn du große Datensätze hast.
-
Sei sehr wählerisch: Filtere nach den Werten, nach denen du filtern musst, und nicht nach mehr. Das hilft, die Anzahl der Zeilen in der Ansicht zu reduzieren und damit die Effizienz der Abfrage zu erhöhen.
-
Sei einfach: Entferne alle unnötigen Bedingungen, Aggregationen und Typenwürfe. All diese Extras haben definitiv einen rechnerischen Preis.
-
Früh filtern: Wenn du eine Aggregation auf Gruppenebene durchführst, filtere die Zeilen mit
WHERE
vor, um den Gruppierungsprozess zu beschleunigen. Auf diese Weise reduzierst du die Anzahl der Zeilen, die in der Gruppierung verarbeitet werden müssen.
Tabelle zum Vergleich
Fassen wir unsere Gedanken in einer praktischen Tabelle zusammen:
Vergleich | WO | HAVING |
---|---|---|
Hauptzweck | Filterung auf Zeilenebene | Filterung auf Gruppenebene |
Grundlegende Syntax | SELECT Spalte1, Spalte2... FROM tabelle_name WHERE bedingung; | SELECT grouped_column, aggregate_function(aggregated_column)... FROM tabellenname GROUP BY grouped_column HAVING condition; |
Bewertungsauftrag | Vor GROUP BY | Nach GROUP BY |
Kompatible Aussagen | AUSWÄHLEN, AKTUALISIEREN, LÖSCHEN | SELECT |
Bedingungen | Kann keine Aggregatfunktionen enthalten | Muss Aggregatfunktionen enthalten |
Anwendungsfälle | Filtern auf Zeilenebene Abrufen von Daten Datenbearbeitung | Filterung auf Gruppenebene Einzelzeilenfilterung |
Unterabfragen | Kann mit Unterabfragen arbeiten | Müssen als CTEs geschrieben werden |
Fazit
Im Laufe des Artikels haben wir den Hauptunterschied zwischen WHERE
und HAVING
in SQL untersucht, nämlich dass die WHERE
Klausel Zeilen vor der Aggregation filtert, während die HAVING
Klausel gruppierte Daten nach der Aggregation filtert. Wir haben auch einige weniger bekannte Unterschiede untersucht, wie z.B. die Tatsache, dass WHERE
mit SELECT
, UPDATE
und DELETE
Anweisungen funktionieren kann, HAVING
aber nur mit SELECT
. Wir haben auch ein bisschen über Leistung gesprochen.
Das SQL Basics Cheat Sheet von DataCamp bietet eine gute Übersicht über die Klauseln WHERE
und HAVING
sowie eine Anleitung, wie man in SQL filtert. Wenn du mit SQL anfängst, solltest du dir auch den Lernpfad SQL Grundlagen und den Lernpfad Associate Data Analyst in SQL ansehen.

Islam ist Datenanalyst, Moderator am KPI Institute und Dozent an der Universität Kairo. Mit einem journalistischen Hintergrund hat Islam vielfältige Interessen, darunter Schreiben, Philosophie, Medien, Technologie und Kultur.
Häufig gestellte Fragen
Was ist der Unterschied zwischen WHERE und HAVING?
WHERE
filtert auf Zeilenebene, während HAVING
auf Gruppenebene filtert.
Kann ich WHERE und HAVING in einer Abfrage kombinieren?
Ja, und es wird dringend empfohlen, WHERE
zu benutzen, wenn du HAVING
verwenden willst.
Kann WHERE mit Aggregatfunktionen wie HAVING funktionieren?
Nein, nur HAVING
kann mit Aggregatfunktionen arbeiten.
Arbeiten WHERE und HAVING mit denselben Vergleichs- und logischen Operatoren?
Ja, sie arbeiten beide mit denselben Operatoren, da WHERE
und HAVING
Bedingungen als logische Ausdrücke geschrieben werden.
Kann ich HAVING ohne GROUP BY verwenden?
HAVING
wird in der Regel nach der Gruppierung mit GROUP BY
verwendet. Die einzige Ausnahme ist das Filtern von Ein-Wert-Ansichten (z. B. die Berechnung einer Kennzahl).
SQL lernen mit DataCamp
Kurs
SQL für Fortgeschrittene
Kurs