一定不要誤以為:“HAVING只能和GROUP BY搭配使用”陨享。
記住一大原則推盛,三大場(chǎng)景就可準(zhǔn)確把握它們的使用方法~~
一大原則:HAVING從篩選的結(jié)果再篩選峦阁,WHERE直接篩選。
三大場(chǎng)景:
沒有GROUP BY的時(shí)候耘成,只使用WHERE而不使用HAVING(其實(shí)也能用榔昔,但是不推薦)。
有GROUP BY的時(shí)候瘪菌,WHERE在GROUP BY前面撒会,HAVING在GROUP BY后面。
使用HAVING的時(shí)候师妙,只用在跟GROUP BY相關(guān)結(jié)果的處理上诵肛。
沒看明白?下面舉例說(shuō)明
例子一:獲取價(jià)格大于20的所有商品名稱和價(jià)格
# A
SELECT price,name FORM `goods` WHERE `price`>20
# B
SELECT price,name FORM `goods` HAVING `price`>20
在A和B中會(huì)得到相同的結(jié)果默穴,這也證明了HAVING完全可以獨(dú)立門戶怔檩,但是我們不推薦,對(duì)于B語(yǔ)句而言蓄诽,是從SELECT price,name FROMgoods的結(jié)果集中再一次篩選price > 20這個(gè)條件薛训。
若B 改為
SELECTnameFORM`goods`HAVING`price`>20
則會(huì)報(bào)錯(cuò),因?yàn)樵诮Y(jié)果集中沒有price仑氛。
例子二:查詢每種category_id商品的價(jià)格平均值乙埃,獲取平均價(jià)格大于1000元的商品信息
# A
SELECT ?`category_id`,AVG(`price`) AS ag FROM `goods` GROUP BY `category_id` HAVING ag >1000
# B?
SELECT ?`category_id`,AVG(`price`) AS ?ag FROM `goods` WHERE ag>1000 ?GROUP BY `category_id` ?
執(zhí)行后蝴猪,我們發(fā)現(xiàn)A語(yǔ)句莫問題,B語(yǔ)句報(bào)錯(cuò)了~說(shuō)明什么膊爪?
HAVING是對(duì)已經(jīng)查到的ag再次進(jìn)行了篩選,而WHERE是對(duì)數(shù)據(jù)表直接查詢嚎莉,數(shù)據(jù)表中并沒有ag字段米酬。這個(gè)例子也證明了HAVING是作用在GROUP BY執(zhí)行后的結(jié)果集上。
例子三:將所有價(jià)格大于30的商品搜索出來(lái)趋箩,然后按照category_id分組
# A
SELECT `category_id` FROM `goods` WHERE `price`>30 GROUP BY `category_id`
# B
SELECT `category_id`,`price` FROM `goods` GROUP BY `category_id` HAVING `price`>30
二者都可以執(zhí)行赃额,例子中WHERE和GROUP BY沒有任何關(guān)系,而having必須作用于group by執(zhí)行后的結(jié)果叫确。
總之一句話:HAVING從篩選的結(jié)果再篩選跳芳,WHERE直接篩選,把握住這點(diǎn)就一起明朗竹勉。