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 WHERE
cláusula.
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
es una agregación. En la WHERE
clá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 WHERE
es 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 SELECT
que 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