Cette question est assez ancienne et une réponse a déjà recueilli 160 voix ...
Je voudrais néanmoins préciser ceci: la question n'est pas en fait de savoir si les noms d'alias peuvent être utilisés dans la WHERE
clause.
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
est une agrégation. Dans la WHERE
clause, nous restreignons les enregistrements que nous voulons des tables en examinant leurs valeurs. sum(reviews.rev_rating)
et count(reviews.rev_id)
, cependant, ne sont pas des valeurs que nous trouvons dans un enregistrement; ce sont des valeurs que nous n'obtenons qu'après agrégation des enregistrements.
C'est donc WHERE
inapproprié. Nous avons besoin HAVING
, car nous voulons restreindre les lignes de résultats après agrégation. Ça ne peut pas être
WHERE avg_rating > 10
ni
WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10
Par conséquent.
HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10
d'autre part est possible et conforme à la norme SQL. Tandis que
HAVING avg_rating > 10
n'est possible que dans MySQL. Ce n'est pas du SQL valide selon la norme, car la SELECT
clause est censée être exécutée après HAVING
. À partir de la documentation MySQL:
Une autre extension MySQL du SQL standard autorise les références 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