一文讓你徹底理解having和where的區別


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM