天天看点

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

--子查询:子查询(内部查询)在主查询前执行一次,结果被用于主查询(外部查询)

--子查询-例:查出比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;