淺談Mysql中where和having的區別

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的綜合運用案例:


20180518162921.png

查詢2門或2門以上不及格同窗的平均成績。

SELECT st_name,sum(score<60)  as k,avg(score) FROM tbl_score group by st_name having k>=2;

相關文章
相關標籤/搜索