日期:2014-05-16  浏览次数:20493 次

ORACLE中的分组函数以及ORACLE中的Group by 与having字句
分组函数的介绍
分组函数
分组函数作用于一组数据,并对一组数据返回一个值.
常见的分组函数有:
函数名称 函数描述
Count 返回找到的记录数
Min 返回一个数字列或计算列的最小值
Max 返回一个数字列或计算列的最大值
Sum 返回一个数字列或计算列总和
avg 返回一个数字列或计算列的平均值
分组函数的语法:
SELECT [column,] group_function(column), ...
FROM table
[WHERE condition]
[GROUP BY column]
[ORDER BY column];
//返回总记录数   注:* 代表的是:一条记录
SQL> select count(*) from emp;
      COUNT(*)
----------
        14
//返回comm不为空的总记录数
SQL>  select count(comm) from emp;
COUNT(COMM)
-----------
          4
//COUNT(DISTINCT expr) 返回 expr非空且不重复的记录总数
SQL> select count(distinct(sal)) from emp;
COUNT(DISTINCT(SAL))
--------------------
                  12
注意:组函数忽略空值。
//返回所有员工的平均工资  
SQL> select avg(nvl(sal,0)) from emp;
注意:NVL函数使分组函数无法忽略空值
//返回员工编号最小值  
SQL> select min(empno) from emp;
//返回员工工资最大值
SQL> select max(sal) from emp;
//求该月本公司发出的工资总额
SQL> select sum(comm)+sum(sal) from emp;
SUM(COMM)+SUM(SAL)
------------------
             31225

SQL> select sum(nvl(sal,0)+nvl(comm,0)) from emp;
SUM(NVL(SAL,0)+NVL(COMM,0))
---------------------------
                      31225
以上两个语句的结果相同
Group by子句
Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。 如果在查询的过程中需要按某一列的值进行分组,以统计该组内数据的信息时,就要使用group by子句。不管select是否使用了where子句都可以使用group by子句。

注意:group by子句一定要与分组函数结合使用,否则没有意义。
//求出每个部门的员工人数
SQL> select deptno,count(*) as "人数" from emp group by deptno;

DEPTNO         人数
------ ----------
    30          6
    20          5
    10          3
//求出每个部门的员工的平均工资
SQL> select deptno,avg(nvl(sal,0)) from emp group by deptno;

DEPTNO AVG(NVL(SAL,0))
------ ---------------
    30 1566.6666666666
    20            2175
    10 2916.6666666666
//注意:group by 子句中的列不必包含在SELECT 列表中
SQL> select avg(nvl(sal,0)) from emp group by deptno;

AVG(NVL(SAL,0))
---------------
1566.6666666666
           2175
2916.6666666666

//求出某个部门中相同职位的员工人数   group by 后可以跟多个分组的字段
SQL> select deptno,job,count(*) from emp group by deptno,job order by deptno;

DEPTNO JOB         COUNT(*)
------ --------- ----------
    10 CLERK              1
    10 MANAGER            1
    10 PRESIDENT          1
    20 ANALYST            2
    20 CLERK              2
    20 MANAGER            1
    30 CLERK