Esta pergunta é bastante antiga e uma resposta já obteve 160 votos ...
Ainda assim, eu deixaria isso claro: na verdade, a questão não é se nomes de alias podem ser usados na WHERE
cláusula.
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
é uma agregação. Na WHERE
cláusula, restringimos os registros que queremos das tabelas observando seus valores. sum(reviews.rev_rating)
e count(reviews.rev_id)
, no entanto, não são valores que encontramos em um registro; são valores que só obtemos após agregar os registros.
Então WHERE
é inapropriado. Precisamos HAVING
, pois queremos restringir as linhas de resultados após a agregação. Não pode ser
WHERE avg_rating > 10
nem
WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10
conseqüentemente.
HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10
por outro lado, é possível e está em conformidade com o padrão SQL. Enquanto que
HAVING avg_rating > 10
só é possível no MySQL. Não é um SQL válido de acordo com o padrão, pois a SELECT
cláusula deve ser executada depois HAVING
. Nos documentos do MySQL:
Outra extensão do MySQL para o SQL padrão permite referências na cláusula HAVING a expressões com alias na lista de seleção.
A extensão MySQL permite o uso de um alias na cláusula HAVING para a coluna agregada
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html