Oracle SQL實現分頁查詢
阿新 • • 發佈:2019-01-02
Oracle SQL分頁查詢
1、表結構
-
SQL> desc test;
-
名稱 是否為空? 型別
-
--------------------- -------- ---------------
-
ID
NOT
NULL
NUMBER(8)
-
USERNAME
VARCHAR2(32)
-
PASSWORD
VARCHAR2(32)
-
AGE
NUMBER(3
)
-
BIRTHDAY
DATE
-
ADDRESS
VARCHAR2(40)
2、表記錄條數
-
SQL>
select count
(*) from test;
-
-
COUNT(*)
-
----------
-
5000001
3、表中部分資料
-
SQL>
select
*
from
test
where
rownum <
10;
-
-
ID
USERNAME
PASSWORD
AGE
BIRTHDAY
ADDRESS
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
325610
user325610
password325610
10
15
-
10月
-
15
The_Earth
-
325611
user325611
password325611
11
15
-
10月
-
15
The_Earth
-
325612
user325612
password325612
12
15
-
10月
-
15
The_Earth
-
325613
user325613
password325613
13
15
-
10月
-
15
The_Earth
-
325614
user325614
password325614
14
15
-
10月
-
15
The_Earth
-
325615
user325615
password325615
15
15
-
10月
-
15
The_Earth
-
325616
user325616
password325616
16
15
-
10月
-
15
The_Earth
-
325617
user325617
password325617
17
15
-
10月
-
15
The_Earth
-
325618
user325618
password325618
18
15
-
10月
-
15
The_Earth
4、進行分頁
1、常用方式
這種方式比較好理解,而且內層查詢效率高,整體查詢效率較穩定。
-
SQL>
select *
-
2
from (
select row_.*, rownum rownum_
-
3
from (
select *
-
4
from test
-
5
order
by id
asc) row_
-
6
where rownum <=
20)
-
7
where rownum_ >=
10;
或者
-
SQL>
select *
-
2
from (
select test.*, rownum rownum_
from test
where rownum <=
5000000
order
by id
asc)
-
3
where rownum_ >=
4999990;
查詢結果
-
ID
USERNAME
PASSWORD
AGE
BIRTHDAY
ADDRESS
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
4999989
user4999989
password4999989
69
15
-
10月
-
15
The_Earth
-
4999990
user4999990
password4999990
70
15
-
10月
-
15
The_Earth
-
4999991
user4999991
password4999991
71
15
-
10月
-
15
The_Earth
-
4999992
user4999992
password4999992
72
15
-
10月
-
15
The_Earth
-
4999993
user4999993
password4999993
73
15
-
10月
-
15
The_Earth
-
4999994
user4999994
password4999994
74
15
-
10月
-
15
The_Earth
-
4999995
user4999995
password4999995
75
15
-
10月
-
15
The_Earth
-
4999996
user4999996
password4999996
76
15
-
10月
-
15
The_Earth
-
4999997
user4999997
password4999997
77
15
-
10月
-
15
The_Earth
-
4999998
user4999998
password4999998
78
15
-
10月
-
15
The_Earth
-
4999999
user4999999
password4999999
79
15
-
10月
-
15
The_Earth
-
-
已選擇11行。
- 1
2、第二種方式
採用這種方式,查詢越靠後,效率越低,整體需要查詢兩次,而且逐條比較,不推薦使用。
-
SQL>
select *
-
2
from test
-
3
where id
not
in
-
4 (
select id
from test
-
5
where rownum <=
20)
-
6
and rownum <=
10
order
by id
asc;
3、第三種方式
這種是採用minus函式取差集的方式獲取,同樣查詢越靠後,效率越低
-
SQL>
select *
-
2
from test
-
3
where rownum <=
20
-
4 minus
-
5
select *
from test
where rownum <=
10;
5、寫成函式方便呼叫
待續……