having子句與where都是設定條件篩選的語句,有相似之處也有區別。
having與where的區別:
having是在分組后對數據進行過濾
where是在分組前對數據進行過濾
having后面可以使用聚合函數
where后面不可以使用聚合
在查詢過程中執行順序:from>where>group(含聚合)>having>order>select。
聚合語句(sum,min,max,avg,count)要比having子句優先執行,所有having后面可以使用聚合函數。而where子句在查詢過程中執行優先級別優先於聚合語句(sum,min,max,avg,count),所有where條件中不能使用聚合函數。
select sum(num) as rmb from order where id>10;
//先查詢出id大於10的數據,再執行聚合語句sum(num)
//執行以下語句會報錯,因為where子句先於sum(num)執行,執行where子句的時候還沒有sum(num),所以會報錯。
select sum(num) as rmb from order where sum(num)>10;
對分組數據再次判斷時要用having
select reports,count(*) from employees group by reports having count(*) > 4;
//首先查詢了select reports,count() from employees group by reports,在此基礎上查找count() > 4的數據。
聚合函數:
例如SUM, COUNT, MAX, AVG等,這些函數和其它函數的根本區別就是它們一般作用在多條記錄上。
HAVING子句可以讓我們直接篩選成組后的各組數據,也可以在聚合后對組記錄進行篩選,而WHERE子句在聚合前先篩選記錄,也就是說作用在GROUP BY 子句和HAVING子句前。
————————————————
版權聲明:本文為CSDN博主「ryan007liu」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/ryan007liu/article/details/91441479
