where與having區別

解釋1、sql

聚合函數是比較where、having 的關鍵。 開門見山。where、聚合函數、having from後面的執行順序:數據庫

where>聚合函數(sum,min,max,avg,count)>havingoracle

列出group by來比較兩者。(因where和having 在使用group by時問的最多) 若須引入聚合函數來對group by 結果進行過濾 則只能用having。(此處很少說,本身想 是先執行聚合函數仍是先過濾 而後比對我上面列出的執行順序 一看便知)函數

 

樣例:select sum(score) from student  where sex='man' group by name having sum(score)>210spa

 

注意事項 一、where 後不能跟聚合函數,由於where執行順序大於聚合函數。 二、where 子句的做用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組以前過濾數據,條件中不能包含聚組函數,使用where條件顯示特定的行。 三、having 子句的做用是篩選知足條件的組,即在分組以後過濾數據,條件中常常包含聚組函數,使用having 條件顯示特定的組,也可使用多個分組標準進行分組。排序

Sql語句中的順序能夠是where——group by——having或者group by——havingclass

Group by 分組select

Order by 排序sql語句

 

解釋2、數據

   「Where」是一個約束聲明,在查詢數據庫的結果返回以前對數據庫中的查詢條件進行約束,即在結果返回以前起做用,且where後面不能使用「聚合函數」;

   「Having」是一個過濾聲明,所謂過濾是在查詢數據庫的結果返回以後進行過濾,即在結果返回以後起做用,而且having後面可使用「聚合函數」。

由於聚合函數是比較where和having的關鍵,因此先說下聚合函數。所謂聚合函數,是對一組值進行計算而且返回單一值的函數,在sql中常見於下面幾個字眼:sum---求和,count---計數,max---最大值,avg---平均值等。

接下來從使用的角度:

  where後面之因此不能使用聚合函數是由於where的執行順序在聚合函數以前,以下面這個sql語句:

錯誤:

 select  sum(score) from student  group by student.sex where sum(student.age)>100;

 

having既然是對查出來的結果進行過濾,那麼就不能對沒有查出來的值使用having,以下面這個sql語句:

錯誤:

select  student.id,student.name from student having student.score >90;

 

下面給出一個where 和 having組合使用的sql語句:

select sum(score) from student where sex='man' group by name having sum(score)>210;


實例:

咱們常常會遇到以「累計(count)」或是「累加(sum)」爲條件的查詢。好比aaa表:

ID, NAME, SHU

1,    a,       3

2,    a,       4

3,    b,       5

4,    b,       7

5,   a,

6,   a,       20

Q1:查詢出現過2次的name。

Select * from aaa group by name having count(name)>=2;

 

Q2:查詢單一用戶的SHU總和大於10的用戶

Select * from aaa group by name having sum(shu)>10;

一個HAVING子句最多隻能包含40個表達式,HAVING子句的表達式之間能夠用AND和OR分割。

 

Q3: 求和用累加 sum ,求行的數用累計 count          select name, count(shu), sum(shu)              from aaa  group by name

       結果爲a      3      27                        b       2     12        可見:oracle 數據庫中對空值的是一致忽略的count 函數認爲沒有此項,而sum函數不計算。

相關文章
相關標籤/搜索