group by子句
有些情况下。需要把一个表中的行分为多个组,然后将这个组作为一个整体,获得改组的一些信息,例如,获得各个部门的员工人数,或某个部门的员工的平均工资等,这时,就需要使用group by子句子句对表中的数据进行分组。
使用group by子句,可以根据表中的某一列或某几列队表中的数据行进行分组,多个列之间使用逗号分隔,如果根据多个列进行分组,oracle会首先根据第一列进行分组,然后再分出来的组中在按照第二列进行分组,以此类推。
对数据分组后,主要是使用一些聚合函数对分组后的数据进行统计。
具体的操作如下:
SQL> select empno,deptno from emp;
EMPNO DEPTNO
---------- ----------
7369 20
7499 30
7521 30
7566 20
7654 30
7698 30
7782 10
7788 20
7839 10
7844 30
7876 20
7900 30
7902 20
7934 10
7935 20
如上面的数据所示,在deptno在的数据值只有10,20,30,那么如果我们想统计下属于部门10,20,30的各个部门各有多少人,我们可以使用以下的语句:
SQL> select deptno "部门编号",count(*) "部门人数" from emp group by deptno;
部门编号 部门人数
---------- ----------
30 6
20 6
10 3
我们也可以统计各个部门的平均工资,如下:
SQL> select deptno,avg(sal) from emp group by deptno;
DEPTNO AVG(SAL)
---------- ----------
30 1708.33333
20 2645.83333
10 2916.66667
group by和having的使用。
having子句
having子句通常与group by子句一起使用,在完成对分组结果的统计后,可以使用having子句对分组的结果进行进一步的筛选。
一个having子句最多可以包含40个表达式,having子句的表达式之间使用关键字and和or分隔。
如下所示,对已经完成分组的部门,我们选出部门人数大于5的部门。
SQL> select deptno "部门编号",count(*) "部门人数" from emp group by deptno having count(*)>5;
部门编号 部门人数
---------- ----------
30 6
20 6
分组后选出部门编号大于10的部门
SQL> select deptno,avg(sal) from emp group by deptno having deptno>10;
DEPTNO AVG(SAL)
---------- ----------
30 1708.33333
20 2645.83333