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 基础 SQL -- DQL 数据查询语言(基础查询(字段别名) where条件查询(比较运算符逻辑运算符) 聚合函数分组查询 排序查询分页查询DQL语句执行顺序)
SQL踩坑:计算函数or聚合函数的字段平级,导致分辨不出彼此的别名问题