地球人都知道,Where關鍵字的做用是過濾,選取符合條件的記錄,而Having關鍵字的做用則是,爲聚合結果指定條件。可是,在某些條件下,使用這二者能夠獲得同樣的結果。函數
好比如下的例子:spa
1.
SELECT BoxType,COUNT(1) FROM BoxType GROUP BY BoxType HAVING BoxType='小箱';
2. SELECT BoxType,COUNT(1) FROM BoxType WHERE BoxType='小箱' GROUP BY BoxType;
這兩段語句獲得的結果是同樣的。code
那麼他們二者的區別在哪呢?blog
首先,Where 子句是用來指定 "行" 的條件的,而Having 子句是指定 「組」 的條件的,即排序
Where 子句 = 指定行所對應的條件索引
Having 子句 = 指定組所對應的條件class
所以,2 語句會比較合適。效率
其次,當在Where子句和Having子句中均可以使用的條件,從語句的執行效率來看,最好寫在Where子句中。數據
在使用Count函數等對錶中的數據進行聚合操做時,DBMS內部會進行排序處理,而排序操做會增長機器的負擔,減小排序的行數,能夠增長處理速度。di
使用Where子句指定條件時,因爲排序以前就對數據進行了過濾,因此可以減小排序的數據量。可是Having子句是在排序以後纔對數據進行分組的,所以與前者相比,須要排序的數據量就要多得多。
第三,使用Where子句更具速度優點的另外一個理由是,能夠對Where子句指定條件所對應的列建立索引,這樣能夠大幅提升處理速度。
第四,Where子句中不能使用聚合函數,而Having子句中能夠。