分组查询
1.行转列函数wm_concat();
select deptno 部门号,wm_concat(ename) 部门中员工的姓名 from emp group by deptno
部门号 部门中员工的姓名
--------- ----------------------
10 CLARK,MILLER,KING
20 SMITH,FORD,ADAMS,SCOTT,JONES
30 ALLEN,JAMES,TURNER,BLAKE,MARTIN,WARD
--------- ----------------------
10 CLARK,MILLER,KING
20 SMITH,FORD,ADAMS,SCOTT,JONES
30 ALLEN,JAMES,TURNER,BLAKE,MARTIN,WARD
2.oracle分组函数会自动过滤掉空值,如果想保留空值,需要加上nvl函数:nvl(comm,0),前一个值为空就返回后一个。
3.在select列表中所有未包含在组函数中的列都应该包含在group by子句中;包含在group by字句中的列不必包含在select列表中。
select deptno,avg(sal) from emp group by deptno;
select avg(sal) from emp group by deptno;
4.过滤分组使用having
having和where的区别:不能在where子句中使用组函数,可以在having中使用
在没有组函数的情况下,where和having通用,但由于SQL优化,应该尽量使用where.having先分组再过滤,where先过滤再分组.
5.a命令append追加,需要有两个以上的空格.
6.group by语句的增强 group by rollup(a,b)
等价于(group by a,b)+(group by a)+(group by null)
例如:select deptno,job,avg(sal) from emp group by rollup(deptno,job);
break on deptno skip 2相同的部门号的值只显示一次,不同的部门号跳过两行.