MySQL的:使用别名字段的聚合函数
问题描述:
我有一个类似的SQL语句:MySQL的:使用别名字段的聚合函数
SELECT COUNT(*) AS foo, SUM(foo) AS foo_sum FROM bar
但是MySQL不允许这一点,因为foo是一个别名。有没有人有这样的想法可以在SQL中完成?
答
不,您不能在选择列表或WHERE子句中使用别名。您只能在GROUP BY,HAVING或ORDER BY中使用别名。
您还可以使用子查询定义的别名:
SELECT foo, SUM(foo) AS foo_sum
FROM (
SELECT COUNT(*) AS foo
FROM bar
);
答
SELECT SUM(foo) as foo_sum
FROM
(
SELECT COUNT(*) AS foo
FROM bar
GROUP BY baz
)
答
我认为这不是一个好主意。如果你想做一个大的查询,最好不用子查询。如果你需要的话,使用COUNT(*)
和更大的没有别名的函数。
我用别名和子查询进行了查询。花了大约一个小时!然后我再现了没有别名的查询。它下降到大约45分钟。忘记在这种情况下的子查询。它不那么困难和更漂亮,但它会让你的查询变慢。
答
我不知道你正在尝试做的,但与上述解决方案,您正在运行的别名表效率不高子查询。
SELECT foo
FROM (SELECT COUNT(*) AS foo FROM employees) AS T;
基本上T是你的别名表,并使用计数这是一个记录,没有使用SUM(富)函数就可以了,因为它是一个记录的含义返回FOO列。
不管怎么说简单的答案:
SELECT Count(1) AS foo from employees;
由于COUNT函数将返回相同的结果,无论什么NOT NULL字段(S)你包括作为COUNT函数的参数(即:括号内),你可以使用COUNT(1)来获得更好的性能。现在数据库引擎不需要获取任何数据字段,而只需检索整数值1.
这甚至意味着什么?选择count(*)将为您提供一行,其中包含表中的行数。包含count(*)的单个行的总和本身就是count(*)。 – 2008-12-16 23:03:31