Câu hỏi này khá cũ và một câu trả lời đã nhận được 160 phiếu bầu ...
Tuy nhiên, tôi sẽ làm rõ điều này: Câu hỏi thực sự không phải là liệu các tên bí danh có thể được sử dụng trong WHERE
mệnh đề hay không.
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
là một tập hợp. Trong WHERE
mệnh đề, chúng tôi hạn chế các bản ghi mà chúng tôi muốn từ các bảng bằng cách xem xét các giá trị của chúng. sum(reviews.rev_rating)
và count(reviews.rev_id)
, tuy nhiên, không phải là các giá trị chúng tôi tìm thấy trong một bản ghi; chúng là những giá trị mà chúng tôi chỉ nhận được sau khi tổng hợp các bản ghi.
Vì vậy, WHERE
là không phù hợp. Chúng tôi cần HAVING
, vì chúng tôi muốn hạn chế các hàng kết quả sau khi tổng hợp. Nó không thể được
WHERE avg_rating > 10
cũng không
WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10
vì thế.
HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10
mặt khác là có thể và tuân thủ tiêu chuẩn SQL. Trong khi
HAVING avg_rating > 10
chỉ có thể trong MySQL. Nó không phải là SQL hợp lệ theo tiêu chuẩn, vì SELECT
mệnh đề được cho là sẽ được thực thi sau đó HAVING
. Từ tài liệu MySQL:
Một phần mở rộng MySQL khác cho SQL chuẩn cho phép các tham chiếu trong mệnh đề HAVING đến các biểu thức bí danh trong danh sách chọn.
Phần mở rộng MySQL cho phép sử dụng bí danh trong mệnh đề HAVING cho cột tổng hợp
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html