共计 1219 个字符,预计需要花费 4 分钟才能阅读完成。
1.rownum 字段
Oracle 下 select 语句每个结果集中都有一个伪字段(伪列)rownum 存在。
rownum 用来标识每条记录的行号,行号从 1 开始,每次递增 1。
rownum 是虚拟的顺序值,前提是先排序
使用 rownum 需注意:
1.rownum 的是在取数据的时候产生的序号。当 rownum 和 order by 一起使用时,会首先选出符合 rownum 条件的记录,然后再进行排序。
2.rownum 在过滤时只能使用:<,<=。rownum 在过滤完之后会重新排行号,如果是 romnum>n 的话,过滤掉不满足条件的,重新排又从 1 开始还是不满足条件,再过滤最终会把所有数据都过滤掉
2. 分页查询
–top n
– 查询工资排名前五的员工信息
– 思路:先按工资进行排序,再根据行号过滤留下前 5 条记录
– 因为 SQL 语句的执行顺序是先执行 select 返回查询结果(行号在此时排好)再进行排序
– 所以先需要用子查询,返回排好序的查询结果
select t.* ,rownum from
(select * from emp order by sal desc)t
where rownum<=5;
– 分页查询
– 查询工资排名 6~10 的员工信息
– 思路:因为过滤完 rownum 字段也会随之变化,所以 rownum 不能使用大于号判断
– 所以还是要用子查询先把行号排好定下来(需要用别名与外层查询的 rownum 区分开来)
select * from
(select t.*, rownum rown
from
(select * from emp order by sal desc) t) where rown>5 and rown<=10;
3.rowid
rowid 是 Oracle 中每个表都有的一个实际存在的一个值,rowid 的值是唯一的
4. 数据去重
– 先创建一张表往里面插入几条相同的数据
create table test01(id number(3),name varchar2(10))
insert into test01 values(123,’ 张三 ’);
insert into test01 values(124,’ 李四 ’);
insert into test01 values(125,’ 王五 ’);
insert into test01 values(126,’ 张三 ’);
insert into test01 values(127,’ 张三 ’);
insert into test01 values(128,’ 李四 ’);
insert into test01 values(129,’ 张三 ’);
– 数据去重
– 思路:重复项进行分组,获取每一组最小(或最大)的 rowid,删除不在此列的数据
delete from test01 where rowid not in(
(select min(rowid) from test01 t group by name)
);
更多 Oracle 相关信息见 Oracle 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=12
: