您的位置:首页 > 数据库 > Oracle

【oracle ocp知识点三】

2014-08-20 22:03 274 查看
操作海量数据

子查询操作数据

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函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: