2008-12-16 768 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.