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 WHEREklauzuli.
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
jest agregacją. W WHEREklauzuli 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 WHEREjest 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ż SELECTklauzula 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