1、处于的语句不一样
WHERE可以用于增删改查,但是HAVING只能用于SELECT。
2、HAVING只能用于SELECT的字段或SELECT AS的临时字段
SELECT DISTINCT(color) FROM xg_base_itemtype HAVING price>=2;
报错:Unknown column 'price' in 'having clause'。
3、误区:HAVING只能与GROUP BY一起使用
这个说法是错误的,比如下面这种情况,在筛选SELECT出来的字段时,其实HAVING和WHERE 的效果是一样的。
SELECT DISTINCT(color) FROM xg_base_itemtype HAVING color>=2;
4、WHERE不可以使用聚合函数、HAVING可以使用聚合函数
聚合函数就是例如SUM, COUNT, MAX, AVG等对一组(多条)数据操作的函数,可能需要配合group by 来使用。
WHERE的条件只能来自表中已有的字段。
SELECT COUNT(*) AS total_num FROM xg_base_itemtype WHERE total_num >10 GROUP BY color;
报错:Unknown column 'total_num' in 'where clause'。
SELECT COUNT(*) AS total_num FROM xg_base_itemtype GROUP BY color HAVING total_num >10;
而HAVING可以直接筛选聚合函数的结果。
5、运行顺序不一样
WHERE的过滤在执行语句进行分组之前应用的。
HAVING的过滤是在分组条件后执行的。
即如果WHERE和HAVING一起用时,WHERE会先执行,HAVING后执行。