where后面不能使用分组函数:
select name,avg(sal) from student where avg(sal) > 60 group by sex; // 错误了。
这种情况只能使用having过滤。
错误原因:
首先先来看一下sql语句的执行顺序:
第一步:from 指定要操作的表
第二步:join 连接表生成一个笛卡尔积
第三步:on 对笛卡尔积进行筛选
第四步:where 筛选条件
第五步:group by 对数据进行分组
第六步:max min avg count sum 执行分组函数
第七步:having 对分组后的数据进行过滤
第八步:select 选取结果
第九步:distinct 去除重复结果
第十步:order by 将结果进行排序
第十一步:limit 取结果集中的部分数据
不难看出,where是在group by之前执行的,分组函数是在group by以后执行的,上面的语句avg在group by之前执行很明显是不对的。