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

119 mysql sql having having-clause

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

sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
Run Code Online (Sandbox Code Playgroud)

Pau*_*xon 223

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

 HAVING avg_rating>5
Run Code Online (Sandbox Code Playgroud)

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

 WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5
Run Code Online (Sandbox Code Playgroud)

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

来自MySQL手册:

不允许在WHERE子句中引用列别名,因为在执行WHERE子句时可能尚未确定列值.请参见第B.1.5.4节"列别名的问题".

  • 进行了重写,使其更加清晰,不允许使用聚合功能 (3认同)
  • 这是一个很好的答案,但请考虑性能影响,因为`HAVING`在获取数据后执行,之前执行`WHERE`. (3认同)

Tor*_*ing 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 ...
Run Code Online (Sandbox Code Playgroud)


Tho*_*ner 8

这个问题很老了,一个答案已经获得了160票......

不过我还是要说清楚:问题实际上在于是否可以在WHERE子句中使用别名。

sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
Run Code Online (Sandbox Code Playgroud)

是一个聚合。在WHERE子句中,我们通过查看它们的值来限制我们想要从表中获取的记录。sum(reviews.rev_rating)并且count(reviews.rev_id),然而,不重视我们的记录找到; 它们是我们只有在汇总记录后才能获得的值。

所以WHERE是不合适的。我们需要HAVING,因为我们想在聚合后限制结果行。不可能

WHERE avg_rating > 10
Run Code Online (Sandbox Code Playgroud)

也不

WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10
Run Code Online (Sandbox Code Playgroud)

因此。

HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10
Run Code Online (Sandbox Code Playgroud)

另一方面是可能的并且符合 SQL 标准。然而

HAVING avg_rating > 10
Run Code Online (Sandbox Code Playgroud)

仅在 MySQL 中可能。根据标准,它不是有效的 SQL,因为该SELECT子句应该在HAVING. 来自 MySQL 文档:

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

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

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