【oracle ocp知识点三】

来源:互联网 发布:淄博seo网站推广 编辑:程序博客网 时间:2024/05/04 03:48
操作海量数据
子查询操作数据
SQL> select ename from emp where sal in(select max(sal) sal from emp);
ENAME
----------
KING
SQL> select ename from emp natural join (select max(sal) sal from emp);
ENAME
----------
KING
SQL>  select ename from emp natural join (select deptno,max(sal) sal from emp group by deptno);
ENAME
----------
BLAKE
SCOTT
KING
FORD
SQL> select ename,sal,(select max(sal) from emp) msal from emp;


ENAME             SAL       MSAL
---------- ---------- ----------
SMITH             800       5000
ALLEN            1600       5000
WARD             1250       5000
JONES            2975       5000
MARTIN           1250       5000
BLAKE            2850       5000
CLARK            2450       5000
SCOTT            3000       5000
无条件的insert
旋转insert
带条件的all insert
带条件的first insert
融合表数据 merge
跟踪数据变化的历史版本
insert all into tab1(col1,...)
           into tab2(col1,...)
select * from tabname;
等价于
insert into tabl select * from tabname;
insert into tab2 select * from tabname;


insert all when ... then into tab1(col1,...)
           when ... then into tab2(col1,...)
select * from tabname;
等价于
insert into tab1 select * from tabname where [when ...];
insert into tab2 select * from tabname where [when ...];


insert first when ... then into tab1(col1,...)
             when ... then into tab2(col1,...)
select * from tabname;
等价于
insert into tab1 select * from tabname where [when ...];
insert into tab2 select * from tabname where not [when ...] and [when...];
=====
SQL> create table ea1 as select empno,ename,sal,deptno from emp where 0=1;


Table created.


SQL> c/ea1/ea2
  1* create table ea2 as select empno,ename,sal,deptno from emp where 0=1
SQL> /


Table created.


SQL> select count(*) from emp where sal>2000;


  COUNT(*)
----------
         6


SQL> c/2000/2500
  1* select count(*) from emp where sal>2500
SQL> /


  COUNT(*)
----------
         5
SQL> insert all  when sal>2000 then into  ea1 values(empno,ename,sal,deptno)
  2   when sal>2500 then into ea2 values(empno,ename,sal,deptno)
  3  select * from emp;
11 rows created.
SQL> select sal from ea1;
       SAL
----------
      2975
      2850
      2450
      3000
      5000
      3000
6 rows selected.
SQL> select * from ea2;
     EMPNO ENAME             SAL     DEPTNO
---------- ---------- ---------- ----------
      7566 JONES            2975         20
      7698 BLAKE            2850         30
      7788 SCOTT            3000         20
      7839 KING             5000         10
      7902 FORD             3000         20
SQL> insert first when sal>2000 then into  ea1 values(empno,ename,sal,deptno)
  2  when sal>2500 then into ea2 values(empno,ename,sal,deptno)
  3  select * from emp;
6 rows created.
SQL> select sal from ea1;
       SAL
----------
      2975
      2850
      2450
      3000
      5000
      3000
6 rows selected.
SQL> select sal from ea2;
no rows selected
SQL> create table ea3(id number,week number ,w1 number,w2 number,w3 number,w4 number,w5 number);
Table created.
SQL> insert into ea3 values(1,10,800,1200,900,1500,2000);
1 row created.
SQL> select * from ea3;


        ID       WEEK         W1         W2         W3         W4         W5
---------- ---------- ---------- ---------- ---------- ---------- ----------
         1         10        800       1200        900       1500       2000
SQL>create table ea3info(id number,week number,sales number)
Table created.
SQL> insert all into ea3info values(id,week,w1)
  2  into ea3info values(id,week,w2)
  3  into ea3info values(id,week,w3)
  4  into ea3info values(id,week,w4)
  5  into ea3info values(id,week,w5)
  6  select * from ea3;


5 rows created.
SQL> select * from ea3info;


        ID       WEEK      SALES
---------- ---------- ----------
         1         10        800
         1         10       1200
         1         10        900
         1         10       1500
         1         10       2000
select versions_starttime,versions_startscn,versions_xid,versions_opertaion,...
from tabname versions between scn|timetamp minvalue and maxvalue where ...;
SQL>  select id,versions_starttime,versions_operation from ea3 versions between scn minvalue and maxvalue where id=1;


        ID
----------
VERSIONS_STARTTIME                                                          V
--------------------------------------------------------------------------- -
         1
20-JUL-14 12.26.19 PM                                                       I




SQL> update ea3 set id=2;


1 row updated.


SQL> commit;


Commit complete.


SQL> select id,versions_starttime,versions_operation from ea3 versions between scn minvalue and maxvalue where id=1;


        ID
----------
VERSIONS_STARTTIME                                                          V
--------------------------------------------------------------------------- -
         1
20-JUL-14 12.26.19 PM                                                       I




SQL>  select id,versions_starttime,versions_operation from ea3 versions between scn minvalue and maxvalue where id=2;


        ID
----------
VERSIONS_STARTTIME                                                          V
--------------------------------------------------------------------------- -
         2
20-JUL-14 12.34.45 PM                                                       U




SQL> delete ea3;


1 row deleted.


SQL> commit;


Commit complete.


SQL>  select id,versions_starttime,versions_operation from ea3 versions between scn minvalue and maxvalue where id=2;


        ID
----------
VERSIONS_STARTTIME                                                          V
--------------------------------------------------------------------------- -
         2
20-JUL-14 12.35.46 PM                                                       D


         2
20-JUL-14 12.34.45 PM                                                       U
SQL> select id from ea3 versions between scn minvalue and maxvalue;


        ID
----------
         2
         2
         1
SQL> select id,versions_operation from ea3 versions between scn minvalue and maxvalue;


        ID V
---------- -
         2 D
         2 U
         1 I
merge into tab1 using tab2 on (tab1.col1-tab22.col1)
   when not matched then 
       insert....
   when matched then
       update....
       ;
SQL>merge into ea2 using ea2 on(ea1.empno=ea2.empno)
when matched then
update set sal=ea2.sal
when not matched then
inser values(ea2.empno,ea2.ename,ea2.sal,ea2.deptno);       
不同时区
alter session set time_zone='-05:00';
sessiontimezone,current_date,tz_offset
SQL> conn / as sysdba
Connected.
SQL> show parameter time_zone
SQL> select dbtimezone from dual;
DBTIME
------
+00:00
SQL> select sessiontimezone from dual;
SESSIONTIMEZONE
---------------------------------------------------------------------------
+08:00
select * from v$timezone_names where TZNAME like'A%'
current_date系统当前时间,current_timestamp系统当前时间数,localtimestamp 用户会话级别的当前时间
SQL> select current_date,current_timestamp,localtimestamp from dual;


CURRENT_D
---------
CURRENT_TIMESTAMP
---------------------------------------------------------------------------
LOCALTIMESTAMP
---------------------------------------------------------------------------
20-JUL-14
20-JUL-14 01.01.31.214428 PM +08:00
20-JUL-14 01.01.31.214428 PM
SQL> alter session set time_zone='-7:00';
Session altered.
SQL> select current_date,current_timestamp,localtimestamp from dual;
CURRENT_D
---------
CURRENT_TIMESTAMP
---------------------------------------------------------------------------
LOCALTIMESTAMP
---------------------------------------------------------------------------
20-JUL-14
20-JUL-14 01.46.37.082407 AM -07:00
20-JUL-14 01.46.37.082407 AM
interval data types
自动作业中用的比较多
to_yminterval() add_months()前者相加可能会出错,比如二月份就会出现31天的问题
SQL> select sysdate+to_yminterval('1-1')from dual;
SYSDATE+T
---------
20-AUG-15
SQL> select add_months(sysdate,13) from dual;


ADD_MONTH
---------
20-AUG-15
to_timestamp()
高级子查询
多列子查询
SQL> select ename,deptno,sal from emp where (deptno,sal) in (select
  2  deptno,max(sal) from emp group by deptno);


ENAME          DEPTNO        SAL
---------- ---------- ----------
BLAKE              30       2850
FORD               20       3000
SCOTT              20       3000
KING               10       5000
SQL> select ename,deptno,sal from emp where sal>(select avg(sal) from
  2  emp where deptno=emp.deptno);


ENAME          DEPTNO        SAL
---------- ---------- ----------
JONES              20       2975
BLAKE              30       2850
CLARK              10       2450
SCOTT              20       3000
KING               10       5000
FORD               20       3000
SQL>  select ename,deptno,sal from emp e where sal in (select max(sal) from emp
  2  where deptno=e.deptno);


ENAME          DEPTNO        SAL
---------- ---------- ----------
BLAKE              30       2850
SCOTT              20       3000
KING               10       5000
FORD               20       3000
效率比较低,使用多表查询
SQL> select ename from emp join (select deptno,max(sal) sal from emp group by deptno) using (deptno,sal);


ENAME
----------
BLAKE
SCOTT
KING
FORD
SQL> select ename from emp join (select deptno,avg(sal) msal from emp group by deptno) a on emp.deptno=a.deptno and sal>msal;


ENAME
----------
ALLEN
JONES
BLAKE
SCOTT
KING
FORD
非成对比较
标准子查询
SQL> select ename,deptno,sal,(select avg(sal) from emp where deptno=e.deptno) as
  2  al from emp e;


ENAME          DEPTNO        SAL         AL
---------- ---------- ---------- ----------
SMITH              20        800       2175
ALLEN              30       1600 1566.66667
WARD               30       1250 1566.66667
JONES              20       2975       2175
MARTIN             30       1250 1566.66667
BLAKE              30       2850 1566.66667
CLARK              10       2450 2916.66667
SCOTT              20       3000       2175
KING               10       5000 2916.66667
TURNER             30       1500 1566.66667
ADAMS              20       1100       2175
效率低下
SQL> select ename,emp.deptno,asal from emp join (select deptno
  2  ,avg(sal) asal from emp group by deptno)a on emp.deptno=a.deptno;


ENAME          DEPTNO       ASAL
---------- ---------- ----------
SMITH              20       2175
ALLEN              30 1566.66667
WARD               30 1566.66667
JONES              20       2175
MARTIN             30 1566.66667
BLAKE              30 1566.66667
CLARK              10 2916.66667
SCOTT              20       2175
KING               10 2916.66667
TURNER             30 1566.66667
ADAMS              20       2175
exist查询
with子句 基于临时表空间的
SQL> with a as (select sal from emp)
  2  select max(sal) from a
  3  union all
  4  select min(sal) from a
  5  union all
  6  select avg(sal) from a;


  MAX(SAL)
----------
      5000
       800
2073.21429
***关联自查不用改成多表查询
正则表达式
SQL> select ename,regexp_instr(ename,'A',1,1) name from emp;


ENAME            NAME
---------- ----------
SMITH               0
ALLEN               1
WARD                2
JONES               0
MARTIN              2
BLAKE               3
CLARK               3
SCOTT               0
KING                0
TURNER              0
ADAMS               1
SQL>  select ename,regexp_instr(ename,'A',1,1,1) name from emp;


ENAME            NAME
---------- ----------
SMITH               0
ALLEN               2
WARD                3
JONES               0
MARTIN              3
BLAKE               4
CLARK               4
SCOTT               0
KING                0
TURNER              0
ADAMS               2
regexp_instr(ename,'A',1,1,X)x为0或者非0表示
SQL> select ename,regexp_substr(ename,'A',1,2) name from emp;


ENAME      NAME
---------- ----------------------------------------
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
11g、12c特有的函数,10g没有的
SQL> select ename,regexp_count(ename,'A') name from emp;


ENAME            NAME
---------- ----------
SMITH               0
ALLEN               1
WARD                1
JONES               0
MARTIN              1
BLAKE               1
CLARK               1
SCOTT               0
KING                0
TURNER              0
ADAMS               2
高级分组
rollup滚动分组
   n+1
   rollup(a)  grou by a
              group by 0
SQL> select deptno,sum(sal) from emp group by deptno
  2  union all
  3  select null,sum(sal) from emp;


    DEPTNO   SUM(SAL)
---------- ----------
        30       9400
        20      10875
        10       8750
                29025


SQL> select deptno,sum(sal) from emp group by rollup(deptno);


    DEPTNO   SUM(SAL)
---------- ----------
        10       8750
        20      10875
        30       9400
                29025


cube 立方分组
2^n
cube(a)  2^1 2
         group by 0
         group by a
SQL> select deptno,sum(sal) from emp group by cube(deptno);


    DEPTNO   SUM(SAL)
---------- ----------
                29025
        10       8750
        20      10875
        30       9400
rollup(a,b)  2+1 3
group by a,b
group by a
group by 0
cube(a,b)   2^2 4
        group by 0
        group by b
        group by a
        group by a,b
SQL> select deptno,job,sum(sal) from emp group by deptno,job;


    DEPTNO JOB         SUM(SAL)
---------- --------- ----------
        20 CLERK           1900
        30 SALESMAN        5600
        20 MANAGER         2975
        30 CLERK            950
        10 PRESIDENT       5000
        30 MANAGER         2850
        10 CLERK           1300
        10 MANAGER         2450
        20 ANALYST         6000


9 rows selected.


SQL> select deptno,job,sum(sal) from emp group by rollup(deptno,job);


    DEPTNO JOB         SUM(SAL)
---------- --------- ----------
        10 CLERK           1300
        10 MANAGER         2450
        10 PRESIDENT       5000
        10                 8750
        20 CLERK           1900
        20 ANALYST         6000
        20 MANAGER         2975
        20                10875
        30 CLERK            950
        30 MANAGER         2850
        30 SALESMAN        5600


    DEPTNO JOB         SUM(SAL)
---------- --------- ----------
        30                 9400
                          29025


13 rows selected.


SQL> l
  1* select deptno,job,sum(sal) from emp group by rollup(deptno,job)
SQL> c/rollup/cube
  1* select deptno,job,sum(sal) from emp group by cube(deptno,job)
SQL> /


    DEPTNO JOB         SUM(SAL)
---------- --------- ----------
                          29025
           CLERK           4150
           ANALYST         6000
           MANAGER         8275
           SALESMAN        5600
           PRESIDENT       5000
        10                 8750
        10 CLERK           1300
        10 MANAGER         2450
        10 PRESIDENT       5000
        20                10875


    DEPTNO JOB         SUM(SAL)
---------- --------- ----------
        20 CLERK           1900
        20 ANALYST         6000
        20 MANAGER         2975
        30                 9400
        30 CLERK            950
        30 MANAGER         2850
        30 SALESMAN        5600
参与分组的确定,为0参与了
SQL>  select deptno,job,sum(sal),grouping(deptno),grouping(job) from emp group by cube(deptno,job);


    DEPTNO JOB         SUM(SAL) GROUPING(DEPTNO) GROUPING(JOB)
---------- --------- ---------- ---------------- -------------
                          29025                1             1
           CLERK           4150                1             0
           ANALYST         6000                1             0
           MANAGER         8275                1             0
           SALESMAN        5600                1             0
           PRESIDENT       5000                1             0
        10                 8750                0             1
        10 CLERK           1300                0             0
        10 MANAGER         2450                0             0
        10 PRESIDENT       5000                0             0
        20                10875                0             1


    DEPTNO JOB         SUM(SAL) GROUPING(DEPTNO) GROUPING(JOB)
---------- --------- ---------- ---------------- -------------
        20 CLERK           1900                0             0
        20 ANALYST         6000                0             0
        20 MANAGER         2975                0             0
        30                 9400                0             1
        30 CLERK            950                0             0
        30 MANAGER         2850                0             0
        30 SALESMAN        5600                0             0


18 rows selected.
rollup((a,b),c)  (a,b) c 2
      group by a,b,c
      group by a,b
      group by 0
cube((a,b),c) 2^2
      group by 0
      group by c
      group by a,b
      group by a,b,c
group by a group by b ---->grouping sets(a,b)
group by a,b group by c ---->grouping sets(a,,c)
SQL> select deptno,job,sum(sal) from emp group by grouping sets(deptno,job);


    DEPTNO JOB         SUM(SAL)
---------- --------- ----------
           CLERK           4150
           SALESMAN        5600
           PRESIDENT       5000
           MANAGER         8275
           ANALYST         6000
        30                 9400
        20                10875
        10                 8750
****统计函数在指定的时间执行,需要在业务空闲的时间执行
层次查询11g/12c 047知识点
树状结构
SQL>  select empno,ename,mgr from emp start with empno=7839 connect by mgr=empno;


     EMPNO ENAME             MGR
---------- ---------- ----------
      7839 KING
SQL> select empno,ename,mgr from emp start with empno=7839 connect by prior empno=mgr;


     EMPNO ENAME             MGR
---------- ---------- ----------
      7839 KING
      7566 JONES            7839
      7788 SCOTT            7566
      7876 ADAMS            7788
      7902 FORD             7566
      7369 SMITH            7902
      7698 BLAKE            7839
      7499 ALLEN            7698
      7521 WARD             7698
      7654 MARTIN           7698
      7844 TURNER           7698


     EMPNO ENAME             MGR
---------- ---------- ----------
      7900 JAMES            7698
      7782 CLARK            7839
      7934 MILLER           7782
SQL> select empno,ename,mgr,level from emp start with empno=7839 connect by prior empno=mgr;


     EMPNO ENAME             MGR      LEVEL
---------- ---------- ---------- ----------
      7839 KING                           1
      7566 JONES            7839          2
      7788 SCOTT            7566          3
      7876 ADAMS            7788          4
      7902 FORD             7566          3
      7369 SMITH            7902          4
      7698 BLAKE            7839          2
      7499 ALLEN            7698          3
      7521 WARD             7698          3
      7654 MARTIN           7698          3
      7844 TURNER           7698          3


     EMPNO ENAME             MGR      LEVEL
---------- ---------- ---------- ----------
      7900 JAMES            7698          3
      7782 CLARK            7839          2
      7934 MILLER           7782          3


取丢一个分支
SQL> select empno,ename,mgr,level from emp start with empno=7839 connect by prior empno=mgr and empno<>7902;


     EMPNO ENAME             MGR      LEVEL
---------- ---------- ---------- ----------
      7839 KING                           1
      7566 JONES            7839          2
      7788 SCOTT            7566          3
      7876 ADAMS            7788          4
      7698 BLAKE            7839          2
      7499 ALLEN            7698          3
      7521 WARD             7698          3
      7654 MARTIN           7698          3
      7844 TURNER           7698          3
      7900 JAMES            7698          3
      7782 CLARK            7839          2


     EMPNO ENAME             MGR      LEVEL
---------- ---------- ---------- ----------
      7934 MILLER           7782          3
SQL> l
  1  select sys_connect_by_path(ename,'/') ename from emp start with
  2* empno=7839 connect by prior empno=mgr
SQL> /


ENAME
--------------------------------------------------------------------------
/KING
/KING/JONES
/KING/JONES/SCOTT
/KING/JONES/SCOTT/ADAMS
/KING/JONES/FORD
/KING/JONES/FORD/SMITH
/KING/BLAKE
/KING/BLAKE/ALLEN
/KING/BLAKE/WARD
/KING/BLAKE/MARTIN
/KING/BLAKE/TURNER


ENAME
--------------------------------------------------------------------------
/KING/BLAKE/JAMES
/KING/CLARK
/KING/CLARK/MILLER
***分析函数*****
function_name ...
voer ....
SQL>  select ename,sal,max(sal) over() from emp;


ENAME             SAL MAX(SAL)OVER()
---------- ---------- --------------
SMITH             800           5000
ALLEN            1600           5000
WARD             1250           5000
JONES            2975           5000
MARTIN           1250           5000
BLAKE            2850           5000
CLARK            2450           5000
SCOTT            3000           5000
KING             5000           5000
TURNER           1500           5000
ADAMS            1100           5000
SQL>  select * from (select ename,sal from emp order by sal desc) where rownum<=3;


ENAME             SAL
---------- ----------
KING             5000
SCOTT            3000
FORD             3000
SQL> select ename,deptno,sal,row_number() over(partition by deptno order by sal desc) top from emp;


ENAME          DEPTNO        SAL        TOP
---------- ---------- ---------- ----------
KING               10       5000          1
CLARK              10       2450          2
MILLER             10       1300          3
SCOTT              20       3000          1
FORD               20       3000          2
JONES              20       2975          3
ADAMS              20       1100          4
SMITH              20        800          5
BLAKE              30       2850          1
ALLEN              30       1600          2
TURNER             30       1500          3


ENAME          DEPTNO        SAL        TOP
---------- ---------- ---------- ----------
MARTIN             30       1250          4
WARD               30       1250          5
JAMES              30        950          6
SQL> select ename,sal from ( select ename,deptno,sal,row_number() over(partition by deptno order by sal desc) top from emp) where top<=3;


ENAME             SAL
---------- ----------
KING             5000
CLARK            2450
MILLER           1300
SCOTT            3000
FORD             3000
JONES            2975
BLAKE            2850
ALLEN            1600
TURNER           1500
SQL> select ename,sal from ( select ename,deptno,sal,dense_rank() over(partition by deptno order by sal desc) top from emp) where top<=3;


ENAME             SAL
---------- ----------
KING             5000
CLARK            2450
MILLER           1300
SCOTT            3000
FORD             3000
JONES            2975
ADAMS            1100
BLAKE            2850
ALLEN            1600
TURNER           1500
区别:rank 没有重复 dense_rank 重复值
model expression函数
0 0
原创粉丝点击