To pytanie jest dość stare, a jedna odpowiedź zdobyła już 160 głosów ...
Mimo to chciałbym wyjaśnić: pytanie w rzeczywistości nie dotyczy tego, czy aliasy mogą być używane w WHERE
klauzuli.
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
jest agregacją. W WHERE
klauzuli ograniczamy rekordy, które chcemy z tabel, patrząc na ich wartości. sum(reviews.rev_rating)
a count(reviews.rev_id)
jednak nie są wartościami, które znajdziemy w zapisach; są to wartości, które otrzymujemy dopiero po zagregowaniu rekordów.
Więc WHERE
jest to niewłaściwe. Potrzebujemy HAVING
, ponieważ chcemy ograniczyć wiersze wyników po agregacji. To niemożliwe
WHERE avg_rating > 10
ani
WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10
W związku z tym.
HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10
z drugiej strony jest możliwy i zgodny ze standardem SQL. Natomiast
HAVING avg_rating > 10
jest możliwe tylko w MySQL. Nie jest to poprawny kod SQL według standardu, ponieważ SELECT
klauzula ma zostać wykonana po HAVING
. Z dokumentacji MySQL:
Inne rozszerzenie MySQL w stosunku do standardowego SQL zezwala w klauzuli HAVING na aliasy wyrażeń na liście wyboru.
Rozszerzenie MySQL zezwala na użycie aliasu w klauzuli HAVING dla kolumny zagregowanej
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html