MySQL:在聚合函数中使用别名字段

Posted

技术标签:

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

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

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

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

【问题讨论】:

这意味着什么?选择 count() 将为您提供单行,其中包含表中的行数。包含 count() 的单行的总和本身就是 count(*)。 【参考方案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。

【讨论】:

以上是关于MySQL:在聚合函数中使用别名字段的主要内容,如果未能解决你的问题,请参考以下文章

别名和聚合函数的 MySQL 查询问题

mysql之聚合函数

MySQL 基础 SQL -- DQL 数据查询语言(基础查询(字段别名) where条件查询(比较运算符逻辑运算符) 聚合函数分组查询 排序查询分页查询DQL语句执行顺序)

SQL踩坑:计算函数or聚合函数的字段平级,导致分辨不出彼此的别名问题

SQL踩坑:计算函数or聚合函数的字段平级,导致分辨不出彼此的别名问题

SQL踩坑:计算函数or聚合函数的字段平级,导致分辨不出彼此的别名问题