Cette question est assez ancienne et une réponse a déjà obtenu 160 votes...
Je tiens tout de même à préciser que la question est en réalité no sur le fait que les noms d'alias peuvent être utilisés dans la section WHERE
clause.
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
est une agrégation. Dans le WHERE
clause nous limitons les enregistrements que nous voulons des tables en regardant leurs valeurs. sum(reviews.rev_rating)
y count(reviews.rev_id)
ne sont cependant pas des valeurs que l'on trouve dans un enregistrement ; ce sont des valeurs que l'on obtient seulement après avoir agrégé les enregistrements.
Alors WHERE
est inapproprié. Nous avons besoin HAVING
car nous voulons restreindre les lignes de résultats après l'agrégation. Cela ne peut pas être
WHERE avg_rating > 10
ni
WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10
donc.
HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10
d'autre part, est possible et conforme à la norme SQL. Alors que
HAVING avg_rating > 10
n'est possible que dans MySQL. Il ne s'agit pas d'un SQL valide selon la norme, car l'élément SELECT
est censée être exécutée après HAVING
. Dans la documentation de MySQL :
Une autre extension de MySQL au SQL standard permet de faire référence dans la clause HAVING à des expressions aliasées dans la liste de sélection.
L'extension MySQL permet l'utilisation d'un alias dans la clause HAVING pour la colonne agrégée
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html