Diese Frage ist ziemlich alt und eine Antwort hat bereits 160 Stimmen erhalten ...
Dennoch würde ich dies klarstellen: Die Frage ist eigentlich nicht, ob Aliasnamen in der WHERE
Klausel verwendet werden können.
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
ist eine Aggregation. In der WHERE
Klausel beschränken wir die gewünschten Datensätze aus den Tabellen, indem wir ihre Werte betrachten. sum(reviews.rev_rating)
undcount(reviews.rev_id)
sind jedoch keine Werte, die wir in einem Datensatz finden; Dies sind Werte, die wir erst nach der Aggregation der Datensätze erhalten.
Ist WHERE
also unangemessen. Wir brauchen HAVING
, da wir Ergebniszeilen nach der Aggregation einschränken wollen. Es kann nicht sein
WHERE avg_rating > 10
Noch
WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10
daher.
HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10
Zum anderen ist dies möglich und entspricht dem SQL-Standard. Wohingegen
HAVING avg_rating > 10
ist nur in MySQL möglich. Es ist kein gültiges SQL gemäß dem Standard, da die SELECT
Klausel danach ausgeführt werden soll HAVING
. Aus den MySQL-Dokumenten:
Eine andere MySQL-Erweiterung für Standard-SQL ermöglicht Verweise in der HAVING-Klausel auf Alias-Ausdrücke in der Auswahlliste.
Die MySQL-Erweiterung ermöglicht die Verwendung eines Alias in der HAVING-Klausel für die aggregierte Spalte
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html