您的位置:首页 > 数据库

其他复杂SQL查询

2014-01-10 15:37 302 查看
1、集合操作符

4个操作符:UNION、UNION ALL、INTERSECT、MINUS

语法格式:

select 语句1

[union | union all | intersect | minus]

select 语句2

使用集合操作符时,必须保证查询的列个数和类型匹配,且有一下限制:

a、集合操作符不适用于LOB、VARRAY和嵌套表列来

b、UNION、INTERSECT、MINUS操作符不适用于LONG列

c、如果选择列表包含表达式或函数,必须为表达式或函数定义列别名

create table manager(id,name,job,sal) as

select empno,ename,job,sal from emp

where empno in (select distinct nvl(mgr,0) from emp);

create table worker(id,name,job,sal) as

select empno,ename,job,sal from emp

where empno not in (select distinct nvl(mgr,0) from emp);

1.1 UNION 取结果集的并集,会自动去除重复行,且以第一列结果升序排序

select id,name,job from manager union

select empno,ename,job from emp

1.2 UNION ALL 取结果集的并集,不会自动去除重复行,且不会对结果集排序

select id,name,job from manager union all

select empno,ename,job from emp

1.3 INTERSECT 取结果集的交集,且以第一列结果升序排序

select id,name,job from manager intersect

select empno,ename,job from emp

1.4 MINUS 取结果集的差集,只会显示在第一结果集存在,第二结果集中不存在的数据,且以第一列结果升序排序

select empno,ename,job from emp minus

select id,name,job from worker;

1.5 控制结果顺序(union all )

union、intersect、minus默认情况会自动基于第一列升序排序,而union all则不会,需要使用order by子句

使用order by时,须放在最后一条select语句之后

使用order by时,列名称相同可直接使用列名排序,若不同必须使用列位置排序

select id,name,job from worker intersect

select empno,ename,job from emp

order by 1;

2、层次查询 用于检索具有层次结果的表行数据

语法格式:

select [level], column, expr... from table //level返回结构的层次

[where condition]

start with condition //指定层次查询的根行

connect by [prior column1=column2 | column1 = column2] //connect by 用于指定父行和子行之间的关系,且须使用prior关键字,column1和column2对应父键列或子键列

2.1 使用prior column1=column2从顶向下显示层次数据 (column1父键 column2子键)

select lpad(' ',3*(level-1))||ename ename,

lpad(' ',3*(level-1))||job job from emp

start with ename='Kevin'

connect by prior empno=mgr;

2.2 使用column1=prior column2从顶向下显示层次 (column1子键 column2父键)

select lpad(' ',3*(level-1))||ename ename,

lpad(' ',3*(level-1))||job job from emp

start with ename='Kevin'

connect by mgr=prior empno;

2.3 使用prior column1=column2从底向上显示层次 (column1子键 column2父键)

select lpad(' ',3*(level-1))||ename ename,

lpad(' ',3*(level-1))||job job from emp

start with ename='James'

connect by prior mgr= empno;

2.4 使用column1=prior column2从底向上显示层次 (column1父键 column2子键)

select lpad(' ',3*(level-1))||ename ename,

lpad(' ',3*(level-1))||job job from emp

start with ename='James'

connect by empno=prior mgr;

3、使用条件表达式

3.1 decode函数

decode(col | expression, search1, result1 [,search2, result2, ...,][,default])

col指定列名

expression指定表达式

若col或者expression结果匹配search1则返回result1;匹配search2则返回result2 ...

3.2 case表达式

处理多重条件分支的2种方法:

使用单一选择符进行等值比较:

select ename,deptno,sal, case deptno

when 10 then sal*1.2

when 20 then sal*1.1

else sal end "actual salary"

from emp;

使用多种条件进行非等值比较:

select ename,sal,case

when sal<2000 then sal*1.2

when sal<3000 then sal*1.1

else sal end "actual salary"

from emp;

4、flashback查询 可显示过去特定时间点或者特定SCN的表数据

SQL> select systimestamp from dual;

SYSTIMESTAMP

--------------------------------------------------------------------------------

07-1月 -14 11.26.52.138339 上午 +08:00

SQL> select sal from emp where empno=7000;

SAL

-----

3800

SQL> update emp set sal=2000 where empno=7000;

1 row updated

SQL> commit;

Commit complete

SQL> select current_scn from v$database;

CURRENT_SCN

-----------

45889887

SQL>update emp set sal=2500 where empno=7000;

1 row updated

SQL> commit;

Commit complete

查询过去某个特定时间点的表数据

SQL> select sal from emp as of timestamp

2 to_timestamp('07-1月 -14 11.26.52')

3 where empno=7000;

SAL

-----

3800

查询基于过去特定SCN的表数据

SQL> select sal from emp as of scn 45889887

2 where empno=7000;

SAL

-----

2000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: