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 WHEREKlausel verwendet werden können.
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
ist eine Aggregation. In der WHEREKlausel 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 WHEREalso 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 SELECTKlausel 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