Этот вопрос довольно старый, и один ответ уже набрал 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