Direkt zum Inhalt

Der Unterschied zwischen WHERE und HAVING in SQL

Entdecke, wie WHERE Daten auf Zeilenebene in SQL-Abfragen filtert, während HAVING gruppierte Daten nach der Aggregation filtert, und beherrsche ihre unterschiedlichen Verwendungen in SQL-Abfragen.
Aktualisierte 14. Feb. 2025  · 8 Min. Lesezeit

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 mit GROUP 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 SQL WHERE

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 SQL HAVING

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.

NOT mit WHERE verwenden

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’;

NOT mit WHERE verwenden

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';

Filtern auf Zeilenebene mit WHERE

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;

MAX() mit HAVING verwenden

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;

WHERE mit HAVING kombinieren

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.

  1. 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.

  2. Sei einfach: Entferne alle unnötigen Bedingungen, Aggregationen und Typenwürfe. All diese Extras haben definitiv einen rechnerischen Preis.

  3. 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 Salahuddin's photo
Author
Islam Salahuddin

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).

Themen

SQL lernen mit DataCamp

Zertifizierung verfügbar

Kurs

Einführung in SQL

2 hr
1M
Lerne in nur zwei Stunden, wie man relationale Datenbanken mit SQL erstellt und abfragt.
Siehe DetailsRight Arrow
Kurs starten
Mehr anzeigenRight Arrow