where 、having和on的区别都有一个共同点就是可以用来过滤数据
其次,在谈这些的区别的时候,我们首先要进行对SQL语言的执行顺序,做一个回忆:
SQL语言中的语法的顺序和执行的顺序是不一样的
其语法的顺序是
1、select(distinct)
2、from
3、where
4、group by
5、having
6、union
7、order by
执行的顺序为:
1、from
2、where
3、group by
4、having
5、select
6、distinct
7、union
8、order by
有一个点:非常的重要就是,为什么不能够在where中使用select 中设定的别名的字段
原因就是在select 在大部分语句执行完之后,也就是在from 、where、group by之后进行执行的:
从以上的区别之间就是可以看出
where是在group by之前进行执行的,所以说是where之后就不能够使用聚合函数进行过滤数据的,只能够使用from表中的字段进行数据的过滤
其主要的原因就是在于:聚合函数是基于列进行计算的,而where子句就是对数据进行行过滤的,在赛选的过程中,依赖于已经赛选完的数据的出的一种结果是一种悖论。
而having是在group by之后进行执行的,这些数据就已经进行分组了,可以进行使用聚合函数进行分组过滤的,是在聚合后对组进行记录的
group by语句通常会和聚合函数一起进行使用的,按照一个或者多个队列的结果进行分组的,然后对每个组执行聚合的操作
以下是一个案例:
列举的是emp表:
求每个部门的平均工资
select deptno ,avg(sal) from emp group by deptno;
求每个部门的平均薪水大于2000的部门
select deptno, avg(sal) avg_em from emp group by deptno having avg_em>2000;