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


121

我需要在WHERE子句中使用别名,但是它一直告诉我它的未知列。有什么办法可以解决这个问题?我需要选择评级高于x的记录。等级的计算方法如下:

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

Answers:


229

您可以使用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节“列别名问题”


1
如果我重复该表达式,它会告诉我:“无效使用组函数”

3
重新措辞以使其更清晰地不允许使用聚集功能
Paul Dixon

很好的解释,尤其是。“但在where子句中……重复..”部分
th3an0maly 2013年

4
这是一个很好的答案,但是请考虑性能影响,因为HAVING在获取数据WHERE之前执行,并且在执行之前执行。
StockB

您不能在WHERE子句中使用聚合函数。WHERE子句一次只过滤一行,而不是整个组。
比尔·卡尔文

33

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 ...

6

这个问题很老了,一个答案已经获得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


0

如果查询是静态的,则可以将其定义为视图,然后可以在查询视图时在where子句中使用该别名。


0
SELECT * FROM (SELECT customer_Id AS 'custId', gender, age FROM customer
    WHERE  gender = 'F') AS c
WHERE c.custId = 100;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.