Oracle 分頁查詢與數據去重


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)
);

去重前       

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM