地球人都知道,Where關鍵字的作用是過濾,選取符合條件的記錄,而Having關鍵字的作用則是,為聚合結果指定條件。但是,在某些條件下,使用這兩者可以得到一樣的結果。
比如以下的例子:
1.
SELECT BoxType,COUNT(1) FROM BoxType GROUP BY BoxType HAVING BoxType='小箱';
2. SELECT BoxType,COUNT(1) FROM BoxType WHERE BoxType='小箱' GROUP BY BoxType;
這兩段語句得到的結果是一樣的。
那么他們兩者的區別在哪呢?
首先,Where 子句是用來指定 "行" 的條件的,而Having 子句是指定 “組” 的條件的,即
Where 子句 = 指定行所對應的條件
Having 子句 = 指定組所對應的條件
因此,2 語句會比較合適。
其次,當在Where子句和Having子句中都可以使用的條件,從語句的執行效率來看,最好寫在Where子句中。
在使用Count函數等對表中的數據進行聚合操作時,DBMS內部會進行排序處理,而排序操作會增加機器的負擔,減少排序的行數,可以增加處理速度。
使用Where子句指定條件時,由於排序之前就對數據進行了過濾,所以能夠減少排序的數據量。但是Having子句是在排序之后才對數據進行分組的,因此與前者相比,需要排序的數據量就要多得多。
第三,使用Where子句更具速度優勢的另一個理由是,可以對Where子句指定條件所對應的列創建索引,這樣可以大幅提高處理速度。
第四,Where子句中不能使用聚合函數,而Having子句中可以。
