好吧,我正在學習,bit由bit,關於什麼HAVING
意味着什麼。HAVING在別名之間是否存在性能差異vs不使用HAVING
現在,我的問題是,如果這兩個查詢有區別的性能特點:
無需
SELECT x + y AS z, t.* FROM t
WHERE
x = 1 and
x+y = 2
與具有
SELECT x + y AS z, t.* FROM t
WHERE
x = 1
HAVING
z = 2
好吧,我正在學習,bit由bit,關於什麼HAVING
意味着什麼。HAVING在別名之間是否存在性能差異vs不使用HAVING
現在,我的問題是,如果這兩個查詢有區別的性能特點:
無需
SELECT x + y AS z, t.* FROM t
WHERE
x = 1 and
x+y = 2
與具有
SELECT x + y AS z, t.* FROM t
WHERE
x = 1
HAVING
z = 2
是的,它應該是不同的 - (1)預計會更快。
確保首先運行主查詢,然後應用過濾器 - 因此它基本上可以處理由(query minus having)返回的數據集。
第一個查詢應該更可取,因爲它根本不會選擇這些記錄。
HAVING用於包含GROUP BY或返回包含聚集函數結果的單個行的查詢。例如,SELECT SUM(scores) FROM t HAVING SUM(scores) > 100
可以返回一行,也可以不返回任何一行。
SQL標準認爲第二個查詢無效,並且某些數據庫系統不接受第二個查詢。
如果這是真的,那麼我再次被問到爲什麼我不能在where子句中使用別名。這是某人(MySQL的作者?)的設計決定,這迫使我寫更復雜的查詢或失去性能。 – ripper234 2010-11-27 12:17:04
返回結果集後分配別名。這就是爲什麼他們可以使用條款但不在where條款中。在SQL服務器中,您可以使用派生列,但我不知道Mysql中有任何此類選項。 – 2010-11-27 12:24:48