原文地址:https://blog.csdn.net/tengdazhang770960436/article/details/6992272
1.where为什么要写在group by之前呢?
因为group by只能够对结果集进行处理,假如说我们可以先分组后对分组之后的结果集进行在where条件下的筛选的话在查询相当于对有些没有必要分组的数据集也进行了分组了,数据小还好的,如果数据量巨大的话,那么这个多余的操作将会消耗大量的内存,而实际上多余的操作是没有必要的。
2.having使用的时机
where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
having 子句被限制子已经在SELECT语句中定义的列和聚合表达式上,这句话的意思参考下面案例(注 案例根据自己测试情况写的,不一定正确),
正确:
select cno,degree from score group by cno having degree >85; 如果 having 后直接使用字段,则字段必须出现在 select 后面
select cno from score group by cno having avg(degree) >85; 如果 having 后使用聚合函数,则聚合函数中的字段不必出现在 select 后面
错误:
select cno from score group by cno having degree >85; 此例中 having 后使用的 degree 未出现在 select 后面,会报错。