having和where的区别
参考自:https://www.cnblogs.com/ljf-Sky/p/9024683.html https://blog.csdn.net/JDJH1024/article/details/76647866
本质的区别就是where筛选的是记录,而having筛选的是组。
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
原因:goods_price作为条件也出现在了查询字段中。
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(X)
原因:如果having后面的条件不是聚合函数,则需要在select之后出现。
注意:如果having后面使用的判断条件是聚合函数,则不需要在select中出现相同字段。
select name from student group by name having min(score)>80 这种情况是允许的,因为having后面使用的是聚合函数作为判断条件,则select后面可以不需要出现min(score)
3、只可以使用having,不可以使用where的情况:
select goods_category_id,avg(good_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(X)报错,这个表里没有这个ag这个字段。
where子句中一般不使用聚合函数那种情况。
注意事项 :
1、where 后不能跟聚合函数,因为where执行顺序大于聚合函数。
2、where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
3、having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

浙公网安备 33010602011771号