你能在mysql的WHERE子句中使用别名吗?

时间:2008-10-14 06:49:46

标签: mysql sql having having-clause

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

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

5 个答案:

答案 0 :(得分:213)

您可以使用HAVING子句,可以查看别名,例如

 HAVING avg_rating>5

但在where子句中,您需要重复表达,例如

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

BUT!并非所有表达式都被允许 - 使用像SUM这样的聚合函数将不起作用,在这种情况下,您将需要使用HAVING子句。

来自MySQL Manual

  

不允许引用a   WHERE子句中的列别名,   因为列值可能尚未   在WHERE子句时确定   被执行。请参阅Section B.1.5.4, “Problems with Column Aliases”

答案 1 :(得分:31)

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

答案 2 :(得分:3)

这个问题相当陈旧,一个答案已经获得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文档:

  

标准SQL的另一个MySQL扩展允许HAVING子句中的引用到选择列表中的别名表达式。

     

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

SELECT * FROM (SELECT customer_Id AS 'custId', gender, age FROM customer
    WHERE  gender = 'F') AS c
WHERE c.custId = 100;