1. 程式人生 > >淺談Mysql中where和having的區別

淺談Mysql中where和having的區別

where和having的區別

一、誤區:

不要錯誤的認為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可以用的前提是我已經篩選出了goods_price字段,在這種情況下和where的效果是等效的。

但是如果沒有select goods_price 就會報錯!!因為having是從前篩選的字段再篩選,而where是從數據表中的字段直接進行的篩選的。

因此可以看到where 是針對數據庫文件的發揮作用,而having是針對結果集發揮作用。

其實第二個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是針對結果集發揮作用。


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這個字段。


三、綜述:


where 後面要跟的是數據表裏的字段,where針對數據庫文件的發揮作用。


而having只是根據前面查詢出來的結果集再次進行查詢,因此having是針對結果集發揮作用。



淺談Mysql中where和having的區別