Pertanyaan ini cukup lama dan satu jawaban sudah mendapatkan 160 suara ...
Namun saya akan memperjelas ini: Pertanyaannya sebenarnya bukan tentang apakah nama alias dapat digunakan dalam WHERE
klausa.
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
adalah agregasi. Dalam WHERE
klausa kami membatasi rekaman yang kami inginkan dari tabel dengan melihat nilainya. sum(reviews.rev_rating)
dan count(reviews.rev_id)
, bagaimanapun, bukanlah nilai yang kita temukan dalam catatan; itu adalah nilai yang hanya kita dapatkan setelah mengumpulkan catatan.
Jadi WHERE
tidak pantas. Kami membutuhkan HAVING
, karena kami ingin membatasi baris hasil setelah agregasi. Tidak mungkin
WHERE avg_rating > 10
maupun
WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10
karenanya.
HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10
di sisi lain dimungkinkan dan sesuai dengan standar SQL. Sedangkan
HAVING avg_rating > 10
hanya mungkin di MySQL. Ini bukan SQL yang valid menurut standar, karena SELECT
klausa seharusnya dijalankan setelahnya HAVING
. Dari dokumen MySQL:
Ekstensi MySQL lain untuk SQL standar memungkinkan referensi di klausa HAVING ke ekspresi alias di daftar pilih.
Ekstensi MySQL mengizinkan penggunaan alias di klausa HAVING untuk kolom agregat
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html