Bu soru oldukça eski ve bir cevap şimdiden 160 oy aldı ...
Yine de şunu açıklığa kavuşturabilirim: Soru aslında cümlecikte takma adların kullanılıp kullanılamayacağıyla ilgili değilWHERE
.
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
bir toplamadır. Gelen WHERE
fıkra onların değerlerine bakarak tablolardan istediğimiz kayıtları kısıtlar. sum(reviews.rev_rating)
vecount(reviews.rev_id)
, ancak, bir kayıtta bulduğumuz değerler değildir; bunlar yalnızca kayıtları topladıktan sonra elde ettiğimiz değerlerdir.
Yani WHERE
uygunsuz. HAVING
Toplamadan sonra sonuç satırlarını kısıtlamak istediğimiz için ihtiyacımız var . Olamaz
WHERE avg_rating > 10
ne de
WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10
dolayısıyla.
HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10
diğer yandan mümkündür ve SQL standardı ile uyumludur. Buna karşılık
HAVING avg_rating > 10
sadece MySQL'de mümkündür. SELECT
Cümlenin daha sonra çalıştırılması gerektiğinden , standarda göre geçerli SQL değildir HAVING
. MySQL belgelerinden:
Standart SQL için başka bir MySQL uzantısı, HAVING yan tümcesinde seçim listesindeki diğer adlı ifadelere referanslara izin verir.
MySQL uzantısı, toplanan sütun için HAVING yan tümcesinde bir takma adın kullanılmasına izin verir
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html