【问题标题】:Can you use an alias in the WHERE clause in mysql?你可以在mysql的WHERE子句中使用别名吗?
【发布时间】:2010-09-17 01:03:48
【问题描述】:

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

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

【问题讨论】:

    标签: mysql sql having having-clause


    【解决方案1】:

    您可以使用 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”

    【讨论】:

    • 如果我重复这个表达式,它会告诉我:“组函数的使用无效”
    • 已重新措辞,以使其更清晰的聚合功能不允许
    • 很好的解释,尤其是。 “但在 where 子句中......重复......”部分
    • 这是一个很好的答案,但请考虑性能影响,因为HAVING 在获取数据之后执行,WHERE 在之前执行。
    • 您不能在 WHERE 子句中使用聚合函数。 WHERE 子句一次只过滤一行,而不是整个组。
    【解决方案2】:

    我不知道这是否适用于 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 ...
    

    【讨论】:

      【解决方案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

      【讨论】:

        【解决方案4】:
        SELECT * FROM (SELECT customer_Id AS 'custId', gender, age FROM customer
            WHERE  gender = 'F') AS c
        WHERE c.custId = 100;
        

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2014-08-28
            • 1970-01-01
            • 2010-09-26
            • 1970-01-01
            • 2019-01-23
            • 2018-04-07
            • 2017-07-18
            • 2021-03-04
            相关资源
            最近更新 更多