Having VS Where

SQL:Having VS Where

     在使用SQL Select 敘述之時難免都會用到Group by子句,而在Group by子句之後可以接著使用Having子句來設定條件。

     我以前一直以為Having除了可以設定Group by之後的結果當條件外其實和Where沒什麼差別,直到有一天客戶告訴我某一支程式查詢的速度變的非常之慢才發現了這個問題。這一類的問題在資料量不大的時候通常很難以被發現,因為那個資料表的筆數當時已經超過了三十萬筆,再加上那個SQL敘述算是挺複雜的,於是就出現了Command Timeout的現象。直到將一些該在Where子句的條件從Having子句移到Where子句之後整個大改觀,整個查詢時間縮短了十倍左右。

     那Having倒底該怎麼用?很簡單的一種方法是,如果是從源頭資料就可以選擇的條件要放在Where子句後面,而當選擇條件為Group by之後出現的才使用Having,例如使用了SUM()函數,且要過濾掉SUM之後的某些數值就要使用Having。

     這只是個小經驗,而且我也測試過,當資料量並不是很大,像是不到十萬筆之類的;或是SQL的敘述也不夠複雜時,不太容易去突顯出這兩個差異,甚至偶爾還會跑出Having比Where快的狀況。