Der SQL HAVING-Befehl ist die WHERE-Bedingung für gruppierte Daten. Das HAVING-Statement ermöglicht es ein gruppiertes Resultset auf Basis einer Aggregatfunktion einzugrenzen. HAVING folgt immer dem GROUP BY-Befehl, kann also nicht davorstehen. Die allgemeine SQL-Syntax lautet:
SELECT column_name FROM table GROUP BY column_name HAVING condition;
Mithilfe des HAVING-Befehls wird also definiert, wie die gruppierte Datenmenge eingeschränkt werden soll.
Beispiel: HAVING versus WHERE
Grenzen wir unser Beispiel so ein, dass alle Filme gezählt werden, die eine Leihdauer kleiner als 5 Tage haben:
SELECT rental_rate, rental_duration, COUNT(rental_rate) AS AnzahlFilme FROM film GROUP BY rental_rate, rental_duration HAVING rental_duration < 5 ORDER BY rental_rate;
Bisher haben wir solche Bedingungen immer mit WHERE-Bedingung geschrieben, was in dem aufgezeigten Beispiel auch ohne Probleme möglich ist. Die SQL-Syntax mit einer WHERE-Bedingung lautet in diesem Fall:
SELECT rental_rate, rental_duration, COUNT(rental_rate) AS AnzahlFilme FROM film WHERE rental_duration < 5 GROUP BY rental_rate, rental_duration ORDER BY rental_rate;
Und liefert das gleiche Ergebnis:
Allerdings kann die WHERE-Bedingung nicht in Kombination mit einer Aggregatfunktion (COUNT(rental_rate)) genutzt werden. Dafür kommt der HAVING-Befehl zum Einsatz, der letztendlich ähnlich wie WHERE-Bedingung arbeitet. Die entsprechende SQL-Syntax lautet:
SELECT rental_rate, rental_duration, COUNT(rental_rate) AS AnzahlFilme FROM film GROUP BY rental_rate, rental_duration HAVING AnzahlFilme < 60 ORDER BY rental_rate;