【问题标题】:MySQL: Use Aliased Fields in Aggregate FunctionsMySQL:在聚合函数中使用别名字段
【发布时间】:2010-09-27 05:48:29
【问题描述】:

我有一个类似这样的 SQL 语句:

SELECT COUNT(*) AS foo, SUM(foo) AS foo_sum FROM bar

但 MySQL 不允许这样做,因为 foo 是一个别名。有谁知道如何在 SQL 中实现这一点?

【问题讨论】:

  • 这意味着什么?选择 count() 将为您提供单行,其中包含表中的行数。包含 count() 的单行的总和本身就是 count(*)。

标签: mysql alias aggregate-functions


【解决方案1】:

不,您不能在选择列表或 WHERE 子句中使用别名。您只能在 GROUP BY、HAVING 或 ORDER BY 中使用别名。

您也可以使用在子查询中定义的别名:

SELECT foo, SUM(foo) AS foo_sum
FROM (
  SELECT COUNT(*) AS foo
  FROM bar
);

【讨论】:

    【解决方案2】:
    SELECT SUM(foo) as foo_sum
    FROM 
    (
        SELECT COUNT(*) AS foo
        FROM bar
        GROUP BY baz
    )
    

    【讨论】:

      【解决方案3】:

      我认为这不是一个好主意。如果要进行大查询,最好不使用子查询。如果需要,请使用 COUNT(*) 和不带别名的更大函数。

      我使用别名和子查询进行了查询。花了大约一个小时!然后我复制了没有别名的查询。它下降到大约45分钟。在这种情况下忘记子查询。它不那么难,更漂亮,但它会让你的查询变慢。

      【讨论】:

        【解决方案4】:

        我不知道您要做什么,但是通过上述解决方案,您在别名表上运行子查询效率不高。

        SELECT foo 
        FROM (SELECT COUNT(*) AS foo FROM employees) AS T;
        

        基本上 T 是您的别名表,它返回带有计数的 foo 列,该列是单条记录,并且没有使用 SUM(foo) 函数的意义,因为它是单条记录。

        无论如何简单的答案:

        SELECT Count(1) AS foo from employees;
        

        由于 COUNT 函数将返回相同的结果,无论您包含哪些 NOT NULL 字段作为 COUNT 函数参数(即:在括号内),您可以使用 COUNT(1) 来获得更好的性能。现在数据库引擎将不必获取任何数据字段,而只需检索整数值 1。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-08
          • 2019-10-08
          • 2010-12-19
          • 2016-11-04
          • 2017-05-06
          • 1970-01-01
          • 1970-01-01
          • 2011-07-22
          相关资源
          最近更新 更多