Oracle基本操作六:子查询,rownum,rowid

来源:互联网 发布:好吃的白巧克力 知乎 编辑:程序博客网 时间:2024/05/01 18:29
--子查询:子查询(内部查询)在主查询前执行一次,结果被用于主查询(外部查询)
--子查询-例:查出比Allen工资高的人
select ename from emp where sal>(select sal from emp where ename='allen')
--子查询-单行子查询:只返回一行结果,关键词:> = <等。若返回多个结果,则报错。
--子查询-使用组函数:查工资比平均工资高
select ename from emp where sal>(select avg(sal) from emp)
--子查询-多行子查询:返加多个结果,需用:
  in  :符合所有结果,
  any :与每个结果比较。如小于最大的,或大于最小的
  all :与每个结果比较。如小于最小的,或大于最大的
--exists:判断子查询是true或false,若ture,则执行主查询
select * from b where where exists(select * from b where b.aid=1);
--exists解析:是采用loop的方式,循环地次数对exists影响很大。
   --若外表数据量小(a)而内表(b)数据量非常大,查询会很快
--exists和in:若用in,则相反。内表(b)数据量小而外表(a)数据量大,则查询会很快




--rownum:伪列,数据表中不存在,只在结果集中存在,用于标记结果集的顺序递加)
   --只有存在rownum=1的数据,才可能存在rownum=2的数据
select rownum,deptno,deptname from dept;
--rownum用途:分页
select empno,enme from (select  rownum tempid,empno,ename from emp t) t where t.tempid between 5 and  ;


--rowid:伪数列,对应于每一行数据,固定且唯一,存入数据时已经确定,是18位的二进制的字符
   --可以用rowid来进行查询,速度快,
   --只有表发生移动(表空间变化,导入,导出)rowid才会发生变化
select rowid,empno,ename,from emp where rowid='AAAR3qAAEAAAACHAAA';
--rowid用途一:查询数据,
--rowid用途二:删除重复数据:1.完全删除,2,删除重复的数据,但保留一条
   --方法一:建临时表,distinct,再删原表,临时表数据再插入原表,效率高
   --方法二:效率低
delete from  tb_test where rowid in(select a.rowid as id) from  tb_test a,tb_test b
where a.rowid>b.rowid and a.name=b.name and a.age=b.age;
   --方法三:not in 效率最低 因为 not 不带索引
delete from tb_test a where rowid not in (select  max(b.rowid) from tb_test b where
a.name=b.name and a.age=b.age;
0 0
原创粉丝点击