您的位置:首页 > 数据库 > Oracle

Oracle SQL实现分页查询

2017-06-08 15:47 531 查看

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、写成函数方便调用

待续……

总结:

1、内查询的高效利用

2、rownum的使用

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: