1. 程式人生 > >Oracle 分頁查詢與數據去重

Oracle 分頁查詢與數據去重

不能 根據 back not char text order by 工資 集中

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 分頁查詢與數據去重