淺談Mysql中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的區別