Это довольно старый вопрос, за один ответ уже набралось 160 голосов ...
Тем не менее, я хотел бы прояснить это: на самом деле вопрос не в том, можно ли использовать псевдонимы в WHERE
предложении.
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
это совокупность. В этом WHERE
предложении мы ограничиваем записи, которые нам нужны из таблиц, просматривая их значения. sum(reviews.rev_rating)
и count(reviews.rev_id)
, однако, это не значения, которые мы находим в записи; это значения, которые мы получаем только после агрегирования записей.
Так что WHERE
это неуместно. Нам нужно HAVING
, так как мы хотим ограничить строки результатов после агрегирования. Не может быть
WHERE avg_rating > 10
ни
WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10
следовательно.
HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10
с другой стороны возможно и соответствует стандарту SQL. В то время как
HAVING avg_rating > 10
возможно только в MySQL. Это недопустимый SQL согласно стандарту, так как SELECT
предложение должно выполняться после HAVING
. Из документов MySQL:
Другое расширение MySQL для стандартного SQL допускает ссылки в предложении HAVING на выражения с псевдонимами в списке выбора.
Расширение MySQL позволяет использовать псевдоним в предложении HAVING для агрегированного столбца.
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html