where子句和having子句區別


感謝大佬:https://blog.csdn.net/XiaopinOo/article/details/78305008

where子句和having子句的區別:

    1.where  不能放在group by后面

    2.having   是跟group by連在一起用的,放在group by 后面,此時的作用相當於where

    3.where  后面的條件中不能有聚集函數,比如SUM(),AVG()等,而HAVING可以。

一、where子句

    where子句:where子句僅僅用於從from子句中返回的值,from子句返回的每一行數據都會用where子句中的條件進行判斷篩選,where子句中允許使用比較運算符和邏輯運算符

二、having子句

    having子句:having子句通常是與order by子句一起使用的,因為having的作用是對使用group by 進行分組統計后的結果進行進一步的篩選。

三、下面通過where子句和having子句的對比,更進一步的理解他們

    在查詢過程中聚合函數(SUM,MIN,MAX,AVG,COUNT)要比having子句優先執行,簡單的理解為只有有了統計結果后我才能執行篩選。where子句在查詢過程中執行優先級別優先於聚合函數(SUM,MIN,MAX,AVG,COUNT),因為他是一句一句篩選的,HAVING子句可以讓我們篩選成組后的對各組數據篩選。而WHERE子句在聚合前篩選記錄,如:現在我們想要部門號不等於10的部門並且工資總和大於8000的部門編號?

    分析:通過where子句篩選除部門編號不為10的部門,然后對部門工資進行統計,然后使用having子句對統計結果進行篩選。

   select deptno,sum(sa1) from emp

        where deptno!='10'  group by deptno

        having sum(sa1)>8000;

四、異同點

    他們的相同之處就是定義搜索條件,不同之處是where子句為單個篩選而having子句和組有關,而不是與單個的行有關

     最后:理解having子句和where子句最好的方法就是基礎select 語句中的那些句子的處理次序:where子句只能接受from子句輸出的數據,而having子句則可以接受來自group by ,where或者from子句的輸入。

having子句會在分組后對分組形成的結果進行過濾。

這個過程需要聚合、排序、因此如果通過where子句限制記錄而省略掉having子句,是可以提升性能的。






總結:
where子句:是在分組之前使用,表示從所有數據中篩選出部分數據,以完成分組的要求,
在where子句中不允許使用統計函數,沒有group by子句也可以使用。
having子句:是在分組之后使用的,表示對分組統計后的數據執行再次過濾,可以使用
統計函數,有group by子句之后才可以出現having子句。


免責聲明!

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



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