Oracle分组与组函数(三)
和GROUP BY的分组表达式一样!!!
3、条件
有两种方法限制分组的行,一是在分组前,使用WHERE,过滤掉不满足条件的行,只对满足条件的行分组。二是,在分组后使用HAVING,只显示满足条件的分组结果。
先说WHERE。
(1)WHERE 条件
我想对薪水大于5000的员工以ID进行分组
gyj@OCM> select id,count(*) from t3 where salary>5000 group by id;
ID COUNT(*)
---------- ----------
2 2
4 2
3 2
和普通的分组没什么两样,只是在GROUP BY前加了个条件而已。
注意,WHERE中条件的判断,优先于分组的执行。先判断条件,对满足条件的行分组。
(2)HAVING 条件
HAVING是在分组后,只显示满足条件的行。
接着前面的例子,比如说,在分组后,只查id大于的信息:
gyj@OCM> select id,count(*) from t3 where salary>5000 group by id having id>2;
ID COUNT(*)
---------- ----------
4 2
3 2
HAVING后的条件不能挪到WHERE中,因为在执行到WHERE时,ORACLE还没有开始分组,此时执行组函数SUM,将会报错。
而HAVING的使用,也有限制,HAVING是在分组后执行。分组后,原表中的列除分组列外,都将不能直接使用。
gyj@OCM> select id,count(*) from t3 group by id having salary>5000;
select id,count(*) from t3 group by id having salary>5000
*
ERROR at line 1:
ORA-00979: not a GROUP BY expression
我将上面WHERE后的条件salary>5000,挪到了HAVING之后,报出了错误。在HAVING后,和SEELCT … FROM这间的列一样,只能有分组列,和经过组函数处理过的其他列。
4、GROUP BY中不能使用别名
gyj@OCM>
select id,count(*) from t3 where salary>5000 group by 1;
select id,count(*) from t3 where salary>5000 group by 1
*
ERROR at line 1:
ORA-00979: not a GROUP BY expression
id在第一列,用id分组,在group by中我用1表示用第一列id分组,不能用这种方式和order by不一样!!!
gyj@OCM> select id bh,count(*) from t3 where salary>5000 group by bh;
select id bh,count(*) from t3 where salary>5000 group by bh
*
ERROR at line 1:
ORA-00904: "BH": invalid identifier
我把ID列设为别名为bh,然后用bh分组报错
gyj@OCM> select id bh,count(*) from t3 where salary>5000 group by id;
BH COUNT(*)
---------- ----------
2 2
4 2
3 2
我把ID列设为别名为bh,然后用id分组没问题,这个地方要注意!
五、组函数的嵌套
单行函数和和组函数可以嵌套使用,组函数和组函数也可以嵌套使用。例如:
gyj@OCM> select sum(salary) from t3 group by id;
SUM(SALARY)
-----------
10000
12000
16000
14000
我根据id对表分组,并计算出每一组的总薪水。现在我想在此基础上,求出哪一组的总薪水最高:
gyj@OCM> select max(sum(salary)) from t3 group by id;
MAX(SUM(SALARY))
----------------
16000
这就是组函数的嵌套使用。ORACLE中规定,组函数嵌套只能嵌两层。其实多层嵌套并没有实际的用途,因此ORACLE没有提供组函数的多层嵌套。但是,单行函数是可以多层嵌套的。