你可以在MySQL的WHERE子句中使用别名吗?

我需要在WHERE子句中使用别名,但它不断告诉我它是一个未知的列。 有什么办法可以解决这个问题吗? 我需要select评分高于x的logging。 评级按以下别名计算:

sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating 

你可以使用HAVING子句,它可以看到别名,例如

  HAVING avg_rating>5 

但在where子句中,您需要重复expression式,例如

  WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5 

但! 不是所有的expression式都将被允许 – 使用像SUM这样的聚合函数将不起作用,在这种情况下,您将需要使用HAVING子句。

从MySQL手册 :

在WHERE子句中引用列别名是不允许的,因为当执行WHERE子句时,列值可能还没有确定。 参见第B.1.5.4节“列别名问题” 。

不知道,如果这在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子句中,我们通过查看它们的值来限制我们从表中find的logging。 sum(reviews.rev_rating)count(reviews.rev_id)不是我们在logging中find的值; 他们是我们只有在汇总logging后才能得到的值。

所以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文档:

对标准SQL的另一个MySQL扩展允许在HAVING子句中引用select列表中的别名expression式。

MySQL扩展允许在聚合列的HAVING子句中使用别名

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

它的查询是静态的,你可以将它定义为一个视图,然后你可以在查询视图时在where子句中使用这个别名。