WHERE是对数据表中的数据做条件判断返回结果,在GROUP BY和聚合函数生效前起作用。
HAVING是对筛选出的结果做条件判断,在GROUP BY和聚合函数生效后对组记录进行筛选。
注意:HAVING不是一定要和GROUP BY配合使用。
接下来我们通过例子来比较where和having的效果。
- where和having都可以使用的情况:
查询价格大于10的商品的名称和价格
SELECT name,price FROM goods WHERE price>10;
SELECT name,price FROM goods HAVING price>10;
结果:
上面的例子,price是查询到的字段,所以可以用having对price的值进行过滤,这种情况having和where效果是一样的。即having可以对筛选的字段的值进行过滤。
- where可以,having不可以的情况:
查询价格大于10的商品的名称和类型
SELECT name,type FROM goods WHERE price>10;
SELECT name,type FROM goods HAVING price>10;
where筛选出来的结果:
having的结果:
Error Code: 1054. Unknown column 'price' in 'having clause'
在该例子中having中条件包含的字段并不是查询到的字段并不能过滤成功。
- where不可以,having可以的情况:
查询每类商品的价格平均值和平均价格大于5的商品信息
SELECT name,type,AVG(price) as avg_price FROM goods WHERE avg_price > 5 GROUP BY type;
SELECT name,type,AVG(price) as avg_price FROM goods GROUP BY type HAVING avg_price > 5;
WHERE 结果:
Error Code: 1054. Unknown column 'avg_price' in 'where clause'
HAVING 结果:
上面的例子中where在聚合函数和GROUP BY 之后执行,所以找不到avg_price字段,无法对聚合后的组进行过滤。