---oracle伪列:rownum rowid

---rownum:给查询结果集的每一行都标记一个行号(整数)

--比如: select e.*,rownum from emp e;

--需要注意的是: 1、rownum会根据查询结果的变化而变化 select e.*,rownum from emp e where deptno = 10;

2、rownum常用于过滤:限制返回结果集的行数(oracle里面的 分页查询 就是用的rownum) --需要注意: 1)rownum作为过滤的对象,只能是 rownum < / <= 某一个值(例外:rownum = 1) --比如:查询emp表中前5行数据 select e.*,rownum from emp e where rownum <= 5;

--如果要查6到10行的数据 select * from emp e where rownum >= 6 and rownum <= 10; ---错了,先生成结果集,再有rownum

--正确的写法:借助子查询 select f.* from (select e.*, rownum rn from emp e) f where f.rn >= 6 and f.rn <= 10;

--把含有rownum(记得取别名)的结果集当做一张表,然后从这张表中去进行过滤

--小练习一把:查询工资排名在第6到第10的员工信息 select f.* from (select e.*, rownum rn from (select * from emp order by sal desc) e) f where f.rn between 6 and 10;


select e.*,rownum from emp e order by e.sal desc;

---ROWID:数据在插入表中时的物理地址,是一串字符串

--比如 select e.*,rowid from emp e;

---rowid的特点:不会存在重复的rowid。

利用这个特点:就可以对重复的数据进行去重操作

--比如: create table test_rowid(tid number(2)); insert into test_rowid values(1); insert into test_rowid values(2); insert into test_rowid values(3); insert into test_rowid values(1); insert into test_rowid values(2); insert into test_rowid values(2); commit;

-- select t.*,rowid from test_rowid t;

--比如:查看tid=1 的数据,并去重 ---1、distinct select distinct * from test_rowid t where tid = 1;

---2、group by select tid from test_rowid t where tid = 1 group by tid;

---3、union select tid from test_rowid t where tid = 1 union select tid from test_rowid t where tid = 1;

---4、rowid:利用其不重复的特性,那么肯定有一个最大的rowid,有个最小的rowid 主要用两个:max(rowid) min(rowid)

--查出rowid最大的那条数据
select tid from test_rowid where rowid = (select max(rowid) from test_rowid t where tid = 1);

--借鉴于:查询工资最高的数据 select * from emp where sal = (select max(sal) from emp);

--小练习一把:查出test_rowid表中的的每一条数据的唯一数据(用rowid)结果就是:1 2 3(一共三条) --查出rowid最大的那条数据
select tid from test_rowid where rowid in (select max(rowid) from test_rowid t group by t.tid);