2008-12-16 771 views
4

我有一个类似的SQL语句:MySQL的:使用别名字段的聚合函数

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

但是MySQL不允许这一点,因为foo是一个别名。有没有人有这样的想法可以在SQL中完成?

+0

这甚至意味着什么?选择count(*)将为您提供一行,其中包含表中的行数。包含count(*)的单个行的总和本身就是count(*)。 – 2008-12-16 23:03:31

回答

5

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

您还可以使用子查询定义的别名:

SELECT foo, SUM(foo) AS foo_sum 
FROM (
    SELECT COUNT(*) AS foo 
    FROM bar 
); 
1
SELECT SUM(foo) as foo_sum 
FROM 
(
    SELECT COUNT(*) AS foo 
    FROM bar 
    GROUP BY baz 
) 
0

我认为这不是一个好主意。如果你想做一个大的查询,最好不用子查询。如果你需要的话,使用COUNT(*)和更大的没有别名的函数。

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

0

我不知道你正在尝试做的,但与上述解决方案,您正在运行的别名表效率不高子查询。

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.