【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函数
子查询操作数据
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
- 【oracle ocp知识点三】
- oracle ocp知识点
- 【oracle ocp知识点一】
- 【oracle ocp 知识点二】
- 【oracle ocp知识点四】
- Oracle知识点笔记(三)
- Oracle基本知识点总结三
- Oracle知识点连载(三)
- oracle ocp
- ocp知识点:控制事务
- OCP学习基本知识点总结
- Oracle知识点(三)数值函数 排序呢查询order by
- Oracle知识点三日期函数 转换函数 通用函数
- ORACLE OCP 考试指南
- Oracle OCP 认证
- 备战oracle OCP考试
- oracle 10g OCP
- oracle OCP指南
- 黑马程序员---object-c知识点总结(二)封装,继承,多态
- 在哪里?
- 2014华为机试,计算给定和牌麻将的番数
- 用C#实现的条形码和二维码编码解码器
- [Android]Dalvik的BOOTCLASSPATH和dexopt流程
- 【oracle ocp知识点三】
- 消费者模式的三种实现方式
- 今天你累了吗?
- JavaScript面向对象之类的继承
- java设计模式 之 创建者模式
- textarea输入内容存入DB方式,及在页面上的再表示
- 安装deepin~
- R学习笔记
- vmware设置U盘启动