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

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

sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
98139 次浏览

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

我不知道这在 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 ...

If your query is static, you can define it as a view then you can use that alias in the where clause while querying the view.

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

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