甲骨文高级查询
1集合运算
,,,,工会并集把两张表合成一张表
,,,,相交交集一样的留下,不一样的不要
,,,, -减去前面的结果减去后面的结果
create table emp3 as select *,得到emp2 where deptno=20; create table  emp4 as select *,得到emp2 where deptno=30; alter table  emp3 rename 用emp20; alter table  emp4 rename 用emp30; select *,得到emp20; select *,得到emp30; select *,得到emp20 union select *,得到emp30; select *,得到emp30 intersect select *,得到emp2; select *,得到emp2 minus select *,得到emp30;
2,连接,和从
依托于该语法,我们可以将一个表形结构的以树的顺序列出来
提供一个伪列级别
找到头 select ename 得到emp2 where  mgr is 零; select empno, ename mgr 得到emp start with ename=酢?connect by prior empno=下; select 水平,empno, ename mgr 得到emp start with ename=(select ename 得到emp2 where mgr is 零),connect by prior empno=下; select *,得到(select level  lv, empno, ename mgr 得到emp start with ename=(select ename 得到emp2 where mgr is 零),connect by prior empno=下),where lv=2,
3高级分组函数
汇总函数小计
汇总函数多一行小计
对于分组的列为空
对于聚集函数为求小计
select 工作,总和(sal),得到emp GROUP by 汇总(工作); select job,sum(sal),round(avg(sal)),max(sal),count(empno)from emp group by rollup(job);
统计rollup(x,y) 统计第一个x 不统计y
select dname,job,sum(sal) from emp inner join dept using(deptno) group by rollup(dname,job);
cube 统计所有的列
select dname,job,sum(sal) from emp inner join dept using(deptno) froup by cube(dname,job) order by dname;
rollup 和cube 就是汇总的结果
grouping 和grouping sets
select grouping(dname),dname ,grouping(job),job,sum(sal) from emp inner join dept using(deptno) group by rollup(dname,job) order by dname;
select * from (select grouping(dname),dname ,grouping(job) N,job,sum(sal) from emp inner join dept using(deptno) group by rollup(dname,job) order by dname) where dname='SALES' and N=1 ;
select grouping(dname),dname,grouping(job),job,sum(sal) from emp inner join dept using(deptno) group by cube(dname,job) order by dname;
只查询汇总的行 总的汇总也不要
select dname,job,sum(sal) from emp inner join dept using(deptno) group by grouping sets(dname,job);
如果需要查询的结果只有小计 可以用cube 和 grouping sets 用grouping sets 的效率高于cube 和rollup
排名函数
既能排序又能排名
rank() over( orader by xx)
重复就会削去下一个编号
select rank() over(order by sal desc),ename,sal from emp;
dense_rank() over(orader by xx)
重复不削去编号
select dense_rank() over(order by sal desc),ename,sal from emp;
先排序在rownum 比rownum 简单
select row_number() over(order by sal desc),ename from emp;