mysql having where(數(shù)據(jù)庫where和having的區(qū)別)
MySQL之Where和Having的區(qū)別
孩子學(xué)習(xí)?對于所有的家長來,最關(guān)心就是孩子的學(xué)習(xí),對吧?如何幫孩子提升學(xué)習(xí)成績呢?影響孩子學(xué)習(xí)成績的因素有哪些?左養(yǎng)右學(xué)教育賴頌強(qiáng)團(tuán)隊(duì)13年的家庭教育服務(wù)經(jīng)驗(yàn)總結(jié),影響孩子學(xué)習(xí)的主要因素有22條之多,家長你了解幾條呢?
對于使用where和having,相信很多人都有過困擾,今天就來講一下我對where和having的認(rèn)識:
從整體聲明的角度來理解:
Where是一個(gè)約束聲明,在查詢數(shù)據(jù)庫的結(jié)果返回之前對數(shù)據(jù)庫中的查詢條件進(jìn)行約束,即在結(jié)果返回之前起作用,且where后面不能使用聚合函數(shù)
Having是一個(gè)過濾聲明,所謂過濾是在查詢數(shù)據(jù)庫的結(jié)果返回之后進(jìn)行過濾,即在結(jié)果返回之后起作用,并且having后面可以使用聚合函數(shù)。
所謂聚合函數(shù),是對一組值進(jìn)行計(jì)算并且返回單一值的函數(shù):sum—求和,count—計(jì)數(shù),max—最大值,avg—平均值等。
從使用的角度:
where后面之所以不能使用聚合函數(shù)是因?yàn)?strong>where的執(zhí)行順序在聚合函數(shù)之前,如下面這個(gè)sql語句:
select sum(score) from student group by student.sex where sum(student.age)>100;
having既然是對查出來的結(jié)果進(jìn)行過濾,那么就不能對沒有查出來的值使用having,如下面這個(gè)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)合來查出不重復(fù)的記錄,sql如下:
select uid,email,count(*) as ct from `edm_user081217` GROUP BY email
然后看這個(gè),就容易理解了
select uid,email,count(*) as ct from `edm_user081217` GROUP BY email HAVING ct > 1 先用group by 對email進(jìn)行分組,在用having來過濾大于1的,這樣查找出來的就是重復(fù)的記錄了.
總結(jié):
1.Where和Having的作用對象不同:WHERE 子句作用于表和視圖,HAVING 子句作用于組。
2.WHERE 在分組和聚集計(jì)算之前選取輸入行(因此,它控制哪些行進(jìn)入聚集計(jì)算), 而 HAVING 在分組和聚集之后選取分組的行。因此,WHERE 子句不能包含聚集函數(shù); 因?yàn)樵噲D用聚集函數(shù)判斷那些行輸入給聚集運(yùn)算是沒有意義的。 相反,HAVING 子句總是包含聚集函數(shù)。
3.having一般跟在group by之后,執(zhí)行記錄組選擇的一部分來工作的。
where則是執(zhí)行所有數(shù)據(jù)來工作的。
再者h(yuǎn)aving可以用聚合函數(shù),如having sum(qty)>1000