Esta pregunta es bastante antiguo y una respuesta ya ganó 160 votos ...
Aún así me gustaría hacer esto en claro: La pregunta es, en realidad no acerca de si los nombres de alias se pueden utilizar en la cláusula WHERE
.
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
es un agregado. En la cláusula WHERE
, restringimos los registros que queremos de las tablas al observar sus valores. sum(reviews.rev_rating)
y count(reviews.rev_id)
, sin embargo, no son valores que encontramos en un registro; son valores que solo obtenemos después de agregar los registros.
WHERE
no es adecuado. 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 que
HAVING avg_rating > 10
solo es posible en MySQL.No es SQL válido según el estándar, ya que se supone que la cláusula SELECT
se ejecuta después de HAVING
. A partir de la documentación de MySQL:
Otra extensión de MySQL a SQL estándar permite que las referencias en la cláusula HAVING a expresiones con alias en la lista de selección.
La extensión de 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
Si repito la expresión, me dice: "uso inválido de la función de grupo" –
Tener redactado de nuevo para que sea más claro las funciones de agregación no permitidas –
Buena explicación, esp. la parte "pero en una cláusula where ... repeat ..." – th3an0maly