一、誤區(qū):
站在用戶的角度思考問題,與客戶深入溝通,找到瑯琊網(wǎng)站設(shè)計與瑯琊網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋瑯琊地區(qū)。
不要錯誤的認為having和group by 必須配合使用.
二、where和having用法解析:
1、 where和having都可以使用的場景:
select goods_price,goods_name from goods where goods_price > 100
select goods_price,goods_name from goods having goods_price > 100
解釋:上面的having可以用的前提是我已經(jīng)篩選出了goods_price字段,在這種情況下和where的效果是等效的。
但是如果沒有select goods_price 就會報錯??!因為having是從前篩選的字段再篩選,而where是從數(shù)據(jù)表中的字段直接進行的篩選的。
因此可以看到where 是針對數(shù)據(jù)庫文件的發(fā)揮作用,而having是針對結(jié)果集發(fā)揮作用。
其實第二個sql語句等價于如下語句更好理解:
select goods_price,goods_name from goods where 1 having goods_price > 100
2. 只可以用where,不可以用having的情況:
select goods_name,goods_number from goods where goods_price > 100
select goods_name,goods_number from goods having goods_price > 100
解釋:第二個sql語句報錯,這是因為前面并沒有篩選goods_price 造成的,更能看出having是針對結(jié)果集發(fā)揮作用。
3. 只可以用having,不可以用where情況:
查詢每種category_id商品的價格平均值,獲取平均價格大于1000元的商品信息。
select category_id , avg(goods_price) as ag from goods group by category_id having ag > 1000
select category_id , avg(goods_price) as ag from goods where ag>1000 group by category_id
解釋:第二個sql語句報錯,這是因為from goods 這張數(shù)據(jù)表里面沒有ag這個字段。
三、綜述:
where 后面要跟的是數(shù)據(jù)表里的字段,where針對數(shù)據(jù)庫文件的發(fā)揮作用。
而having只是根據(jù)前面查詢出來的結(jié)果集再次進行查詢,因此having是針對結(jié)果集發(fā)揮作用。
四、where和having的綜合運用案例:
查詢2門或2門以上不及格同學(xué)的平均成績。
SELECT st_name,sum(score<60) as k,avg(score) FROM tbl_score group by st_name having k>=2;