概念及注意事项
1、组函数:对一组数据进行操作,最后返回一个值,用作统计分析,求所有的非空值。
2、关键字DISTINCT可以排除重复值。
3、参数的类型可以是CHAR,VARCHAR2,NUMBER,DATE
4、除了COUNT(*)外,其他所有组函数都忽略空值,可以使用NVL函数处理
5、select之后,如果其中有一个组函数,那么其他的也要是组函数。
avg() 平均
count() 计数
max() 最大值
min() 最小值
sum() 求和
1、数字类型可以使用很多组函数
SQL> select sum(sal) sum,avg(sal) avg,max(sal) max,min(sal) min,count(*) count
2  from emp1;
SUM        AVG        MAX        MIN      COUNT
---------- ---------- ---------- ---------- ----------
35025       2335       6000        800         15
2、对日期类型使用MIN,MAX
SQL> select min(hiredate),max(hiredate)
2  from emp;
MIN(HIREDATE)       MAX(HIREDATE)
------------------- -------------------
1980-12-17 00:00:00 1987-05-23 00:00:00
3、COUNT(*)函数返回表中行的总数,包括重复行与数据列中含有空值的行。
SQL> select count(*) from emp1;
COUNT(*)
----------
15
COUNT(EXPR)返回expr标识的列所含非空行的数量。
SQL> select count(comm) from emp1;
COUNT(COMM)
-----------
4
4、在组函数中使用NVL函数
SQL> select avg(nvl(comm,0)) from emp1;//将分母变成有效的值14
AVG(NVL(COMM,0))
----------------
146.666667
SQL> select avg(comm) from emp1;//这里的分母是4,只有四个非空值
AVG(COMM)
----------
550
GROUP BY 创建数据组
1、基本用法
SQL> select deptno,avg(sal) from emp1
2  group by deptno;
2、使用WHERE先过滤到一些信息
SQL> select deptno,avg(sal) avg from emp1
2  where sal > 1200
3  group by deptno;
3、对分组结果排序
1  select deptno,avg(sal) from emp1
2  where sal > 2000
3  group by deptno
4* order by avg(sal)
4、对分组结果进行过滤
1  select deptno,avg(sal) from emp1
2  where avg(sal) > 2000
3* group by deptno//这是错误的
where avg(sal) > 2000
*
ERROR at line 2:
ORA-00934: group function is not allowed her
应该使用HAVING子句【HAVING子句应该在GROUP BY子句后面】
1  select deptno,avg(sal) from emp1
2  group by deptno
3* having avg(sal)>2000
SQL> /
DEPTNO   AVG(SAL)
---------- ----------
20       2175
40       6000
10 2916.66667
5、注意事项
(1)确保SELECT列表中除了组函数的项,所有列都包含在GROUP BY子句中
SQL> select deptno,avg(sal) avg,comm //comm不在group子句中
2  from emp1
3  where sal>1200
4  group by deptno
5  ;
select deptno,avg(sal) avg,comm
*
ERROR at line 1:
ORA-00979: not a GROUP BY expression
(2)GROUP BY产生的结果,是基于分组列升序排列的。
(3)如果使用ORDER BY子句对分组结果排序,确保ORDER BY子句在最后。
其它函数
stddev()返回标准差
variance()返回统计方差