Java39:数据库三(Oracle)

  

甲骨文高级查询

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;









Java39:数据库三(Oracle)