Этот вопрос довольно старый и один ответ уже получил 160 голосов ...
Тем не менее я хотел бы сделать это ясно: вопрос на самом деле не о том, псевдонимы могут быть использованы в предложении WHERE
.
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
- это агрегация. В предложении WHERE
мы ограничиваем записи, которые мы хотим от таблиц, просматривая их значения. sum(reviews.rev_rating)
и count(reviews.rev_id)
, однако, не являются значениями, которые мы находим в записи; они являются значениями, которые мы получаем только после агрегирования записей.
So 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
Если я повторяю выражение, он говорит мне: «недопустимое использование функции группы» – 2008-10-14 06:57:25
Have изменено, чтобы сделать его более четкими функции агрегирования, не разрешенные – 2008-10-14 07:04:03