MySql、SQLServer、Oracle 数据分页查询

MySql、SQLServer、Oracle 数据分页查询

(一)、 mysql的分页查询
mysql的分页查询是最简单的,借助关键字limit即可实现查询,查询语句通式:

– sql:可以是单表的查询语句,也可以是多表的联合查询语句

– firstIndex:开始的索引(一般需要加一,从0开始)

– pageSize:每页显示的记录数

select  * from (sql)   limit firstIndex,pageSize

如下面的截图,每页显示的记录数为10:

select * from stockinfo limit 0,10

查询(1-10)这10条记录
在这里插入图片描述

查询(10-20)这10条记录

select * from stockinfo limit 10,10

在这里插入图片描述

(二)、sqlserver的分页查询
在sqlserver使用row_number()解析函数来完成分页查询,效率提高很大,不过sql语句比较复杂,下面给出分页查询的通式:

– firstIndex:起始索引

– pageSize:每页显示的数量

– orderColumn:排序的字段名

– sql:可以是简单的单表查询语句,也可以是复杂的多表联合查询语句

select top pageSize a.* from (
select row_number() over(order by b.orderColumn) as rownumber,
b.* from(sql) b)
b where rownumber>firstIndex;

下面看截图,每页显示10条记录数:
查询(1-10)这10条记录

select top 10 a.* from (
    select row_number() over(order by b.UserID) as rownumber,
    b.* from Sys_User b) a where rownumber>0;

在这里插入图片描述

查询(11-20)这10条记录

select top 10 a.* from (
select row_number() over(order by b.UserID) as rownumber,
b.* from Sys_User b)   a where rownumber>10;

在这里插入图片描述

(三)、oracle分页查询
oracle的分页查询方法相对来说要多点,ROWNUM、row_number(),今天主要将两种效率稍好的分页查询语句。
①ROWNUM查询分页通式:

– firstIndex:起始索引

– pageSize:每页显示的数量

– sql:可以是简单的单表查询语句,也可以是复杂的多表联合查询语句

select * from(select a.*,ROWNUM rn from(sql) a where
 ROWNUM<=(firstIndex+pageSize)) where rn>firstIndex

以下截图是以这种方式进行的查询语句:
查询(1-21)这20条记录*****(没有ID=6的记录,所以查询到的最大ID为21)

在这里插入图片描述
查询(22-41)这20条记录*****(没有ID=6的记录,所以开始查询到的ID为22,以及最大ID为41)

在这里插入图片描述

②row_number()解析函数分页查询通式:

– firstIndex:起始索引

– pageSize:每页显示的数量

– orderColumn:排序的字段名

– sql:可以是简单的单表查询语句,也可以是复杂的多表联合查询语句

select * from(select * from(select t.*,row_number() over
(order by orderColumn) as rownumber from(sql) t) p where
 p.rownumber>firstIndex) where rownum<=pageSize

以下截图是使用row_number()方式的分页查询效果:
查询(1-21)这20条记录*****(没有ID=6的记录,所以查询到的最大ID为21)
在这里插入图片描述

查询(22-41)这20条记录*****(没有ID=6的记录,所以开始查询到的ID为22,以及最大ID为41)
在这里插入图片描述 我们知道在ROWNUM查询的方式中,

在第二层的sql语句中有个"where ROWNUM<firstIndex+pageSize",根据oracle的原则,第二层查询语句会嵌入到最内层中进行查询,也就是说,最开始执行的查询语句类似于:

select * from wyuse where rownum<(firstIndex+pageSize) order by id asc

从数据表中查询出(firstIndex+pageSize)条记录,所以如果这个值很小的话,效率会很好,如果对于大数据量的表单,这个值如果是上千,比如:select * from wyuse where rownum<(5000) order by id asc,这样一开始会选出5000条记录,效率自然会慢很多。

相对于ROWNUM,row_number()方式可能通过简化可以少一层嵌套,对于大数量的查询,效率也高不到哪里去…对于大数量如果为表建立索引再结合row_number()效果会很好。