1、誤區:sql
不要錯誤的認爲having和group by 必須配合使用.數據庫
2、where和having用法解析:
app
一、 where和having均可以使用的場景:ide
select goods_price,goods_name from goods where goods_price > 100spa
select goods_price,goods_name from goods having goods_price > 100orm
解釋:上面的having能夠用的前提是我已經篩選出了goods_price字段,在這種狀況下和where的效果是等效的。blog
可是若是沒有select goods_price 就會報錯!!由於having是從前篩選的字段再篩選,而where是從數據表中的字段直接進行的篩選的。it
所以能夠看到where 是針對數據庫文件的發揮做用,而having是針對結果集發揮做用。class
其實第二個sql語句等價於以下語句更好理解:select
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是針對結果集發揮做用。
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 這張數據表裏面沒有ag這個字段。
3、綜述:
where 後面要跟的是數據表裏的字段,where針對數據庫文件的發揮做用。
而having只是根據前面查詢出來的結果集再次進行查詢,所以having是針對結果集發揮做用。
4、where和having的綜合運用案例:
查詢2門或2門以上不及格同窗的平均成績。
SELECT st_name,sum(score<60) as k,avg(score) FROM tbl_score group by st_name having k>=2;