Loading

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 条件显示特定的组,也可以使用多个分组标准进行分组。

posted @ 2020-11-14 15:59  爱睡懒觉的我  阅读(397)  评论(0)    收藏  举报