Esta pregunta es bastante antigua y una respuesta ya obtuvo 160 votos ...
Aún así, dejaría esto en claro: la pregunta en realidad no es si los nombres de alias se pueden usar en la WHEREcláusula.
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
es una agregación. En la WHEREcláusula restringimos los registros que queremos de las tablas mirando sus valores. sum(reviews.rev_rating)ycount(reviews.rev_id) , sin embargo, no son valores que encontremos en un registro; son valores que solo obtenemos después de agregar los registros.
Entonces WHEREes inapropiado. Necesitamos HAVING, ya que queremos restringir las filas de resultados después de la agregación. No puede ser
WHERE avg_rating > 10
ni
WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10
por lo tanto.
HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10
por otro lado es posible y cumple con el estándar SQL. Mientras
HAVING avg_rating > 10
solo es posible en MySQL. No es SQL válido de acuerdo con el estándar, ya SELECTque se supone que la cláusula se ejecuta después HAVING. De los documentos de MySQL:
Otra extensión de MySQL para SQL estándar permite referencias en la cláusula HAVING a expresiones con alias en la lista de selección.
La extensión MySQL permite el uso de un alias en la cláusula HAVING para la columna agregada
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html