主要区别
where:
1、不可以使用聚合函数
2、在结果返回之前起作用
having:
1、可以使用聚合函数
2、在结果返回之后起作用
这里“聚合函数”的定义就不再赘述了,无非就是SUM、AVG、MAX等这些。
这里唯一有点理解难度的可能就是对于“结果返回”的理解,为了帮助理解,请看下面三个例子:
1、where与having都可以用
select goods_price,goods_name
from sw_goods
where goods_price > 100
select goods_price,goods_name
from sw_goods
having goods_price > 100
1)where直接从表sw_goods中查找符合goods_price>100条件的数据并返回goods_price与goods_name。
2)having是将表sw_goods中所有goods_price与goods_name返回,再再其中筛选满足goods_price>100条件的数据。
2、where可用而having不可用
select goods_name,goods_number
from sw_goods
where goods_price > 100
select goods_name,goods_number
from sw_goods
having goods_price > 100 //报错!!!
1)where直接从表sw_goods中查找符合goods_price>100条件的数据并返回goods_number与goods_name。
2)having报错的根本原因是因为,将表sw_goods中所有goods_number与goods_name返回,再用goods_price>100去判断,则找不到对应的属性。
3、having可用而where不可用
select goods_category_id , avg(goods_price) as ag
from sw_goods
group by goods_category
having ag > 1000
select goods_category_id , avg(goods_price) as ag
from sw_goods
where ag>1000
group by goods_category //报错!!
1)将表sw_goods中所有数据按照goods_category归类,并返回goods_category_id 与 avg(goods_price),having再通过条件avg(goods_price)>1000进行筛选
2)where中不能使用聚合函数故报错。
结论
设select中所有字段简称为A,where与having中的筛选条件为B
1)where则是先按照筛选条件B获得满足条件数据的字段A并返回。
2)having则是在表中所有数据组成的字段A的基础上再通过条件B进行筛选