Це питання досить старе, і одна відповідь вже набрала 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/uk/group-by-handling.html