【发布时间】:2010-09-17 01:03:48
【问题描述】:
我需要在 WHERE 子句中使用别名,但它一直告诉我它是一个未知列。有没有办法解决这个问题?我需要选择评级高于 x 的记录。评分计算为以下别名:
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
【问题讨论】:
标签: mysql sql having having-clause
我需要在 WHERE 子句中使用别名,但它一直告诉我它是一个未知列。有没有办法解决这个问题?我需要选择评级高于 x 的记录。评分计算为以下别名:
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
【问题讨论】:
标签: mysql sql having having-clause
您可以使用 HAVING 子句,它可以看到别名,例如
HAVING avg_rating>5
但是在 where 子句中你需要重复你的表达,例如
WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5
但是!并非所有表达式都被允许 - 使用像 SUM 这样的聚合函数将不起作用,在这种情况下,您需要使用 HAVING 子句。
来自MySQL Manual:
不允许引用 WHERE 子句中的列别名, 因为列值可能还没有 当 WHERE 子句被确定 被执行。见Section B.1.5.4, “Problems with Column Aliases”。
【讨论】:
HAVING 在获取数据之后执行,WHERE 在之前执行。
我不知道这是否适用于 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 子句中,我们通过查看表中的值来限制我们想要的记录。但是,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;
【讨论】:
如果您的查询是静态的,您可以将其定义为视图,然后您可以在查询视图时在 where 子句中使用该别名。
【讨论】: