我有一個類似的SQL語句:MySQL的:使用別名字段的聚合函數
SELECT COUNT(*) AS foo, SUM(foo) AS foo_sum FROM bar
但是MySQL不允許這一點,因爲foo是一個別名。有沒有人有這樣的想法可以在SQL中完成?
我有一個類似的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