Cette question est tout à fait vieux et une réponse déjà gagné 160 votes ...
Cependant, je Feraient clairement: La question est en fait pas de savoir si les noms d'alias peuvent être utilisés dans la clause WHERE
.
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
est une agrégation. Dans la clause WHERE
, nous limitons 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 obtenons seulement après avoir agrégé les enregistrements.
Donc, WHERE
est inapproprié. Nous avons besoin de HAVING
, car nous voulons restreindre les lignes de résultat après l'agrégation. Il 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 est conforme à la norme SQL. Considérant que
HAVING avg_rating > 10
est seulement possible dans MySQL.Ce n'est pas un SQL valide selon la norme, puisque la clause SELECT
est censée être exécutée après HAVING
. À partir des documents MySQL:
Une autre extension MySQL au langage SQL standard permet aux références dans la clause HAVING d'avoir 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
Si je répète l'expression, il me dit: « utilisation invalide de la fonction de groupe » –
Avez reformulé pour rendre plus claires les fonctions d'agrégation interditesd –
Belle explication, esp. le "mais dans une clause where ... repeat .." partie – th3an0maly