`Select city FROM weather WHERE temp_lo = (SELECT max(temp_lo) FROM weather);`
作用的對象不同。
WHERE 子句作用于表和視圖,HAVING 子句作用于 組。
WHERE 在分組和聚集計算之前選取輸入行(因此,它控制哪些行進入聚集計算), 而 HAVING 在分組和聚集之后選取分組的行。因此,WHERE 子句不能包含聚集函數; 因為試圖用聚集函數判斷那些行輸入給聚集運算是沒有意義的。 相反,HAVING 子句總是包含聚集函數。(嚴格說來,你可以寫不使用聚集的 HAVING 子句, 但這樣做只是白費勁。同樣的條件可以更有效地用于 WHERE 階段。)
在前面的例子里,我們可以在 WHERE 里應用城市名稱限制,因為它不需要聚集。 這樣比在 HAVING 里增加限制更加高效,因為我們避免了為那些未通過 WHERE 檢查的行進行分組和聚集計算
綜上所述:
having一般跟在group by之后,執行記錄組選擇的一部分來工作的。
where則是執行所有數據來工作的。
再者having可以用聚合函數,如having sum(qty)>1000