HAVING ist eine Bedingung, die auf aggregierte Werte angewendet werden kann. Die WHERE Bedingung kann zum Beispiel auf gruppierte Werte (GROUP BY) nicht angewendet werden, dafür muss man HAVING verwenden.
HAVING Syntax
SELECT spalten_name, aggregations_funktion(spalten_name) FROM tabelle1 GROUP BY spalten_name HAVING aggregations_funktion(spalten_name) operator wert
HAVING = WHERE für gruppierte Daten
Im vorigen Teil haben wir alle Fragen selektiert und mittels GROUP BY noch die Anzahl der Antworten zu jeder Frage hinzugefügt:
SELECT questions.*, count(questions.id) FROM questions JOIN answers ON (questions.id = answers.question_id) GROUP BY questions.id
Das wollen wir nun wieder machen, nur diesmal sollen nur die Fragen angezeigt werden, die mehr als 1 Antwort haben. Dazu nutzen wir HAVING, welches wir auf die aggregierten Werte anwenden (die Anzahl der Antworten sind die aggregierten Werte):
SELECT questions.*, count(questions.id) AS anzahl_antworten FROM questions JOIN answers ON (questions.id = answers.question_id) GROUP BY questions.id HAVING anzahl_antworten > 1
Mit WHERE kann man nur einen bestimmten Bereich einschränken, sobald man Werte gruppiert und Einschränkungen anhand der Gruppierung machen möchte, benötigt man HAVING. Gerade für die weiteren SQL Funktionen, auf die wir im nächsten Teil eingehen werden, wird HAVING häufig benötigt.



Jack | am 11. Februar 2011 um 18:30 Uhr
Folgender SQL-Befehl ist nach meinem Verständniss nicht in Ordnung:
1 SELECT questions.*, count(questions.id) AS anzahl_antworten
2 FROM questions JOIN answers
3 ON (questions.id = answers.question_id)
4 GROUP BY questions.id
5 HAVING anzahl_antworten > 1
Grund: Die Spaltenvariable 'anzahl_antworten' nach der HAVING-CLAUSE ist nicht in den Tabellen der FROM-Liste enthalten. Die Ergebnisstabelle ist zu diesem Zeitpunkt noch gar nicht generiert, um sich auf die Spalte 'anzahl_antworten' beziehen zu können.
Bitte korrigiert mich falls ich da falsch liege, jedoch funktioniert der o.g SQL-Befehl an der Apache Derby DB nicht.
Jedoch funktioniert es so: … HAVING count(questions.id)> 1;
Gruß
Jack