2010-11-27 88 views

回答

3

HAVING運行在總結行 - WHERE被施加GROUP BY之前對整個表進行操作。 (您不能將GROUP BY放在一邊,HAVING是保留與GROUP BY一起使用的子句 - 忽略GROUP BY不會更改在幕後發生的隱式操作)。

重要的是要注意,因此,WHERE可以使用索引,而HAVING不能。 (在超級平凡的未分組結果集中,理論上可以使用HAVING的索引,但我從來沒有見過以這種方式實際實現查詢優化器)。

+0

但我鏈接的答案根本不涉及GROUP BY ... – ripper234 2010-11-27 10:12:44

+2

@ ripper234:如果您查看該查詢的查詢分析器以及GROUP BY查詢,您會注意到它們奇怪地相同(除了加載實際的表達式值) - 您仍然支付GROUP BY - O(n)迭代對結果集中每個元素的「懲罰」,以應用HAVING子句。 – 2010-11-27 10:14:47

2

MySQL會評估直至幷包括WHERE子句的查詢,然後使用HAVING子句進行過濾。這就是爲什麼HAVING可以識別列別名,而WHERE不能。

通過省略GROUP BY子句,我相信你只是告訴查詢不要對任何結果進行分組。

1

非常廣泛地,WHERE過濾進入查詢的數據(數據庫表),而HAVING過濾查詢的輸出。

WHERE子句中的語句只能引用表(和其他外部數據源),而HAVING子句中的語句只能引用由查詢產生的數據。

相關問題