数据库where,group by,having使用原理分析

来源:互联网 发布:2016年新开的淘宝店 编辑:程序博客网 时间:2024/06/06 10:57

1.聚合函数时何时需要使用 group by  ?

       在聚合函数之后一定要使用group by因为既然是聚合函数就一定是对一些记录进行了聚合,比如max,min,avg它们都是对于一定范围内的数据进行的统计,比如max既然是最大值那肯定是对于具有相同条件的一些记录里面的最大值,比如是公司里面的不同的部门里面的员工的工资都有最大值,这个时候分组的依据就是部门了,min()和avg()都是一样的,你必须要指定是哪个范围内的最小值和哪个范围内的平均值因此使用group by也不难就是根据自己的业务去使用分组就行了,业务是查询出来每个部门里面的员工的工资的最大值那么你肯定要以部门为分组依据了,如果你要是查询很多公司中间不同的公司的员工的某些信息的话,那么这个时候你需要以公司为分组的依据,总之group by就是要把除了使用了聚合函数之外的所有的列都要写在它的后面,因为你以它们为分组的依据的,如果说在你使用聚合函数的时候没有使用到group by那么就说明你默认使用的是group by表里面的所有的列。

      不过group by之后的列不一定要在select中出现,因为select只是自己要查询的信息,而group by只是对结果进行了分组,我只是使用了一些分组的条件而已,为什么一定要在select中出现呢?

例如:

select deptno,max(sal) from emp where ename!='smith' group by deptno having deptno!=60;


2.where为什么要写在group by之前呢?

    因为group by只能够对结果集进行处理,假如说我们可以先分组后对分组之后的结果集进行在where条件下的筛选的话在查询相当于对有些没有必要分组的数据集也进行了分组了,数据小还好的,如果数据量巨大的话,那么这个多余的操作将会消耗大量的内存,而实际上多余的操作是没有必要的。

 

3.having使用的时机

      where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。

having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

having 子句被限制子已经在SELECT语句中定义的列和聚合表达式上。通常,你需要通过在HAVING子句中重复聚合函数表达式来引用聚合值,就如你在SELECT语句中做的那样。例如:

SELECT A COUNT(B) FROM TABLE GROUP BY A HAVING COUNT(B)>2


如何记忆group by用法呢?

查什么分什么,不分等于表分;

意思就是查询什么字段就要按照什么字段进行分组,如果没有分组,那么就说明是按照整个表来分的,比如查询emp表中的工资,如果我们这么写:select avg(sal),deptno from emp group by deptno;就是前面的那句话,查询了deptno那么我们在后面就要按照deptno进行分组,如果我们是这么查询的:select avg(sal) from emp;那么我们没有进行分组那么就是默认的按照表来分组的,所以就是查询的整张表的平均值。


 

原创粉丝点击