Oracle SQL实现分页查询

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的使用

阅读更多
换一批

没有更多推荐了,返回首页