其他复杂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
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
相关文章推荐
- Oracle 10g数据库概述
- mysql 主从同步
- Hibernate Web DAO层代码及数据库基本操作解释
- 使用hsql建立本地文件类型存储的数据库
- sqlite嵌入式移植
- Oracle 执行计划(Explain Plan) 说明
- ORACLE_RESETLOGS浅析
- oracle 监听启动不了 解决方法
- SQL按日期天数(即 每日)合并统计项
- ORACLE 创建视图时,提示用户权限不足
- 通过SSH通道来访问MySQL
- oracle 中rownum和rowid的区别与用法
- 数据库 索引
- oracle with 语句用法
- 十步完全理解SQL
- mysql_config_editor使用测试
- Memcached Java Client API详解
- MySQL主从同步机制及同步中的问题处理
- Oracle Hints详解
- Oracle SQL优化规则详解