MySQL之Where和Having的區(qū)別
對于使用where和having钙态,相信很多人都有過困擾慧起,今天就來講一下我對where和having的認識:
從整體聲明的角度來理解:
Where是一個約束聲明,在查詢數(shù)據(jù)庫的結(jié)果返回之前對數(shù)據(jù)庫中的查詢條件進行約束册倒,即在結(jié)果返回之前起作用蚓挤,且where后面不能使用聚合函數(shù)
Having是一個過濾聲明,所謂過濾是在查詢數(shù)據(jù)庫的結(jié)果返回之后進行過濾驻子,即在結(jié)果返回之后起作用灿意,并且having后面可以使用聚合函數(shù)。
所謂聚合函數(shù)崇呵,是對一組值進行計算并且返回單一值的函數(shù):sum---求和缤剧,count---計數(shù),max---最大值演熟,avg---平均值等鞭执。
從使用的角度:
where后面之所以不能使用聚合函數(shù)是因為where的執(zhí)行順序在聚合函數(shù)之前,如下面這個sql語句:
select sum(score) from student group by student.sex where sum(student.age)>100;
having既然是對查出來的結(jié)果進行過濾芒粹,那么就不能對沒有查出來的值使用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;
用group by和having子句聯(lián)合來查出不重復的記錄,sql如下:
select uid,email,count(*) as ct from `edm_user081217` GROUP BY email
然后看這個,就容易理解了
select uid,email,count(*) as ct from `edm_user081217` GROUP BY email HAVING ct > 1
先用group by 對email進行分組,在用having來過濾大于1的,這樣查找出來的就是重復的記錄了.
總結(jié):
1.Where和Having的作用對象不同:WHERE 子句作用于表和視圖化漆,HAVING 子句作用于組估脆。
2.WHERE 在分組和聚集計算之前選取輸入行(因此,它控制哪些行進入聚集計算)座云, 而 HAVING 在分組和聚集之后選取分組的行疙赠。因此付材,WHERE 子句不能包含聚集函數(shù); 因為試圖用聚集函數(shù)判斷那些行輸入給聚集運算是沒有意義的圃阳。 相反厌衔,HAVING 子句總是包含聚集函數(shù)。
3.having一般跟在group by之后捍岳,執(zhí)行記錄組選擇的一部分來工作的富寿。
where則是執(zhí)行所有數(shù)據(jù)來工作的。
再者having可以用聚合函數(shù)锣夹,如having sum(qty)>1000