您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息

Oracle多表的复杂查询

2024/4/29 1:41:23发布6次查看
一.分页查询: 1. 根据rowid来分 select * from t_xiaoxi where rowid in (select rid from (select rownum rn, rid fr
一.分页查询:
1.      根据rowid来分
  select * from t_xiaoxi where rowid in (select rid from (select rownum rn, rid from(select rowid rid, cid from t_xiaoxi order by cid desc) where rownum9980) order by cid desc;
执行时间0.03秒
2.      按分析函数来分
  select * from (select t.*, row_number() over(order by cid desc) rk from t_xiaoxi t) where rk9980;
执行时间1.01秒
3.      按rownum来分
  select * from (select t.*,rownum rn from(select * from t_xiaoxi order by cid desc)t where rownum9980;
执行时间0.1秒
按rownum来分
a. rownum 分页
  select * from emp;   
b. 显示rownum[oracle分配的]
select e.*, rownum rn from (select * from emp) e;
 rn相当于oracle分配的行的id号
c.挑选出6—10条记录
先查出1-10条记录
select e.*, rownum rn from (select * from emp) e where rownum 如果后面加上rownum>=6是不行的,
然后查出6-10条记录
select * from (select e.*, rownum rn from (select * from emp) e where rownum = 6;
*指定查询列,只需要修改最里层的子查询
select * from (select e.*, rownum rn from (select ename, sal from emp) e where rownum = 6;
*排序查询,,只需要修改最里层的子查询
工资排序后查询6-10条数据
select * from (select e.*, rownum rn from (select ename, sal from emp order by sal) e where rownum = 6;
二.用查询结果创建新表
create table mytable (id, name, sal, job, deptno) as select empno, ename, sal, job, deptno from emp;
三.合并查询
实际应用中,有时为了合并多个select语句的结果,可以使用集合操作符号union,union all,intersect,minus
多用于数据量比较大的数据局库,运行速度快。
1). union
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行。
select ename, sal, job from emp where sal >2500
union
select ename, sal, job from emp where job = 'manager';
2).union all
该操作符与union相似,但是它不会取消重复行,而且不会排序。
select ename, sal, job from emp where sal >2500
union all
select ename, sal, job from emp where job = 'manager';
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行。
3). intersect
  使用该操作符用于取得两个结果集的交集。
select ename, sal, job from emp where sal >2500
intersect
select ename, sal, job from emp where job = 'manager';
4). minus
使用改操作符用于取得两个结果集的差集,他只会显示存在第一个集合中,而不存在第二个集合中的数据。
select ename, sal, job from emp where sal >2500
minus
select ename, sal, job from emp where job = 'manager';
(minus就是减法的意思)
四.左右连接
  1、内连接(自然连接): 只有两个表相匹配的行才能在结果集中出现
  2、外连接: 包括
 (1)左外连接 (左边的表不加限制) select a.studentno, a.studentname, b.classname
  from students a, classes b where a.classid = b.classid(+);
 (2)右外连接(右边的表不加限制) select a.studentno, a.studentname, b.classname
  from students a, classes b where a.classid(+) = b.classid
 (3)全外连接(左右两表都不加限制)
总之,
左连接显示左边全部的和右边与左边相同的
右连接显示右边全部的和左边与右边相同的
内连接是只显示满足条件的!
补充:
使用(+)的注意事项:
1.(+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。
2.当使用(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符。
3.(+)操作符不能与or和in操作符一起使用。
4.(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。
相关阅读:
oracle 并行查询
oracle用户信息查询操作语句
oracle单表查询某列最大最小值的性能问题
回收站引发oracle查询表空间使用缓慢
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录