sql分页查询语句(分页的几种方式与优缺点)
分页,就是在满足条件的一堆有序数据中截取当前所需要展示的那部分。
实际上各种数据库都考虑到分页问题而内置了一些策略,比如mysql的limit,oracle的rownum和row_number(),sqlserver的top和row_number(),基于此可以得到一些分页代码的方法。
1、 基于mysql的limit和oracle的rownum,可以直接限制返回区间,以下以limit为例(使用rownum时注意子查询):
方法一、直接限制返回区间
select * from table where 查询条件 order by 排序条件 limit ((页码-1)*页大小),页大小;
优点:写法简单。
缺点:当页码和页大小过大时,性能明显下降。
适用:数据量不大。
2、基于limit(mysql)、rownum(oracle)和top(sqlserver),他们可以限制返回的行数,因此可以得到以下两套通用的方法(以sqlserver为例):
方法二、not in
优点:通用性强。
缺点:当数据量较大时向后翻页,not in中的数据过大会影响性能。
适用:数据量不大。
方法三、max
优点:速度快,特别是当id为主键时。
缺点:适用面窄,要求排序条件单一且可比较。
适用:简单排序(特殊情况也可尝试转换成类似可比较值处理)。
3、基于sqlserver和oracle的row_number(),可以得到返回数据的行号,基于此在限制返回区间得到如下方法(以sqlserver为例):
方法四、row_number()
优点:在数据量较大时相比not in有优势。
缺点:小数据量时效率不如not in方便。
适用:大部分分页查询需求。