总结:
1.提示当使用group by时,未在group by部分用到的表列在select部分出现时必须使用分组函数。
2.having子句允许用户指定对一个记录组的搜索条件。而通常的where查询条件只针对单记录,不针对记录组。
3.在Group By子句中,必须采用表达式的全称,而不能够采用其别名.
4.采用Group语句会自动对纪录进行排序。在使用Order By排序子句对统计结果进行重新排序的时候,要慎重。
5.如果想把某个字段当作第一顺序排序的话,则只需要把这个字段放置在分组语句中的第一个参数即可。
示例:
-
--聚合函数,不能出现在where子句中,比如where avg(salary)>4000
-
select t.deptno,sum(t.sal) from emp t group by t.deptno having sum(t.sal)>9000;
-
-
DEPTNO SUM(T.SAL)
-
------ ----------
-
30 9400
-
20 10875
-
--查出表中name重复大于10条的记录
-
select name from test group by name having count(*)>10;
-
--Rollup分组产生的结果集包含常规的分组和小计行。在生成包含小计和合计的报表时,ROLLUP 运算符很有用。
-
--使用grouping函数标识rollup或者cube创建的行
-
--用GROUPING函数模拟能够发现在一行中的构成小计的分组,返回0或者1。
-
--GROUPING函数返回0意味着下列情况:这个表达式包含在小计中.
-
--GROUPING函数返回1意味着下列情况:这个表达式没有包含在小计中.
-
select decode(grouping(t.deptno),1,'10/20/30',t.deptno) deptno,
-
case
-
when grouping(t.ename)=1 and grouping(t.deptno)=0 then '小计'
-
when grouping(t.ename)=1 and grouping(t.deptno)=1 then '合计'
-
else t.ename
-
end ename,
-
sum(t.sal) sal
-
from emp t group by rollup(t.deptno,t.ename);
-
-
DEPTNO ENAME SAL
-
---------------------------------------- ---------- ----------
-
10 KING 5000
-
10 CLARK 2450
-
10 MILLER 1300
-
10 小计 8750
-
20 FORD 3000
-
20 ADAMS 1100
-
20 JONES 2975
-
20 SCOTT 3000
-
20 SMITH 800
-
20 小计 10875
-
30 WARD 1250
-
30 ALLEN 1600
-
30 BLAKE 2850
-
30 JAMES 950
-
30 MARTIN 1250
-
30 TURNER 1500
-
30 小计 9400
-
10/20/30 合计 29025
-
--Cube操作依据条件中列的所有可能组合情况进行分组,并对每一个分组返回一行汇总。CUBE是一个类似ROLLUP的扩展,使得可以用一个语句计算所有可能的聚合。
-
select t.deptno,sum(t.sal) sal from emp t group by cube (t.deptno);
-
-
DEPTNO SAL
-
------ ----------
-
29025
-
10 8750
-
20 10875
-
30 9400
-
--使用grouping sets产生一个单独的结果集(等价于union all的方式)
-
--GROUPING SETS是GROUP BY子句的扩展,可以在一个查询中定义多个组。
-
--Oracle服务器计算所有在GROUPING SETS子句中指定的组,并且把每个单独的组产生的结果进行UNION ALL操作。
-
--GROUPING SET的效率:只需要一次全表扫描,不需要写复杂的UNION语句,同时GROUPING SETS子句中含有的元素越多,得到的性能增益越大。
-
select t.deptno,t.ename,t.job from emp t group by grouping sets((t.deptno,t.ename),(t.deptno,t.job));
-
-
DEPTNO ENAME JOB
-
------ ---------- ---------
-
20 JONES
-
30 WARD
-
20 SCOTT
-
10 KING
-
30 JAMES
-
30 ALLEN
-
30 MARTIN
-
30 BLAKE
-
20 FORD
-
20 SMITH
-
20 ADAMS
-
10 MILLER
-
10 CLARK
-
30 TURNER
-
20 CLERK
-
30 SALESMAN
-
20 MANAGER
-
30 CLERK
-
10 PRESIDENT
-
30 MANAGER
-
10 CLERK
-
10 MANAGER
-
20 ANALYST
-
-
select t.deptno,t.ename from emp t group by (t.deptno,t.ename);
-
-
DEPTNO ENAME
-
------ ----------
-
20 JONES
-
30 WARD
-
20 SCOTT
-
10 KING
-
30 JAMES
-
30 ALLEN
-
30 MARTIN
-
30 BLAKE
-
20 FORD
-
20 SMITH
-
20 ADAMS
-
10 MILLER
-
10 CLARK
-
30 TURNER
-
-
select t.deptno,t.job from emp t group by (t.deptno,t.job);
-
-
DEPTNO JOB
-
------ ---------
-
20 CLERK
-
30 SALESMAN
-
20 MANAGER
-
30 CLERK
-
10 PRESIDENT
-
30 MANAGER
-
10 CLERK
-
10 MANAGER
-
20 ANALYST
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29096438/viewspace-1470151/
,如需转载,请注明出处,否则将追究法律责任。