Answers:
您可以使用HAVING子句,该子句可以看到别名,例如
HAVING avg_rating>5
但是在where子句中,您需要重复您的表达式,例如
WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5
但!并非所有的表达式都被允许-使用像SUM这样的聚合函数将不起作用,在这种情况下,您将需要使用HAVING子句。
从MySQL手册:
不允许在WHERE子句中引用列别名,因为执行WHERE子句时可能尚未确定列值。请参见第B.1.5.4节“列别名问题”。
HAVING
在获取数据WHERE
之前执行,并且在执行之前执行。
Dunno,如果这在mysql中有效,但是使用sqlserver,您也可以将其包装为:
select * from (
-- your original query
select .. sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
from ...) Foo
where Foo.avg_rating ...
这个问题很老了,一个答案已经获得160票。
我还是要说清楚:实际上,问题不在于是否可以在WHERE
子句中使用别名。
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
是一个聚合。在WHERE
子句中,我们通过查看表的值来限制我们想要的表中的记录。sum(reviews.rev_rating)
并且count(reviews.rev_id)
,然而,不重视我们的记录找到; 它们是我们仅在汇总记录后获得的值。
所以WHERE
是不合适的。我们需要HAVING
,因为我们想限制聚合后的结果行。不可能是
WHERE avg_rating > 10
也不
WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10
因此。
HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10
另一方面是可能的,并且符合SQL标准。鉴于
HAVING avg_rating > 10
仅在MySQL中可用。根据标准,这不是有效的SQL,因为该SELECT
子句应该在之后执行HAVING
。从MySQL文档:
MySQL对标准SQL的另一个扩展允许在HAVING子句中引用选择列表中的别名表达式。
MySQL扩展允许在HAVING子句中为聚合列使用别名
https://dev.mysql.com/doc/refman/5.7/zh/group-by-handling.html