数据库分页语句

来源:互联网 发布:靠谱的mac淘宝代购 编辑:程序博客网 时间:2024/05/22 11:41

取出sql表中第3140的记录(以自动增长ID为主键)

sql server方案1

 

   select top 10 * from t where id not in (select top 30 id from t order by id ) orde by id

sql server方案2

   select top 10 * from t where id in (select top 40 id from t order by id) order by id desc

 

mysql方案:select * from t order by id limit 30,10

 

oracle方案:

SELECT * FROM 
(
SELECT A.*, ROWNUM RN 
FROM (SELECT * FROM TABLE_NAME) A 
WHERE ROWNUM <= 40
)
WHERE RN >= 21
 

1.分页技术1(直接利用sql语句进行分页,效率最高和最推荐的)

 

 

mysql:sql = "select * from articles limit " + (pageNo-1)*pageSize + "," + pageSize;

oracle: sql = "select * from " +

                                                       "(select rownum r,* from " +

                                                              "(select * from articles order by postime desc)" +

                                                       "where rownum<= " + pageNo*pageSize +") tmp " +

                                                "where r>" + (pageNo-1)*pageSize;

注释:第7行保证rownum的顺序是确定的,因为oracle的索引会造成rownum返回不同的值

简洋提示:没有order by时,rownum按顺序输出,一旦有了order byrownum不按顺序输出了,这说明rownum是排序前的编号。如果对order by从句中的字段建立了索引,那么,rownum也是按顺序输出的,因为这时候生成原始的查询结果集时会参照索引表的顺序来构建。

 

sqlserver:sql = "select top 10 * from id not id(select top " + (pageNo-1)*pageSize + "id from articles)"

 

top方案:
   sql codeselect top 10 * from table1
   where id not in(select top 开始的位置 id from table1)

max:
    sql codeselect top 10 * from table1
    where id>(select max(id)
    from (select top 开始位置 id from table1order by id)tt)

row:
sql codeselect *
from (
    select row_number()over(order by tempcolumn)temprownumber,*
    from (select top 开始位置+10 tempcolumn=0,* from table1)t
)tt
where temprownumber>开始位置


效率:
第1:row
第2:max
第3:top

缺点:
max:必须用户编写复杂sql,不支持非唯一列排序
top:必须用户编写复杂sql,不支持复合主键
row:不支持sqlserver2000

测试数据:
共320万条数据,每页显示10条数据,分别测试了2万页、15万页和32万页。

页码,top方案,max方案,row方案
2万,60ms,46ms,33ms
15万,453ms,343ms,310ms
32万,953ms,720ms,686ms


是一种通过程序拼接sql语句的分页方案,
用户提过的sql语句不需要编写复杂的sql逻辑

诺用户提供sql如下
sql code
select * from table1


从第5条开始,查询5条,处理后sql变为
sql code
select *
from (
    select row_number()over(order by tempcolumn)temprownumber,*
    from (select top 10 tempcolumn=0,* from table1)t
)tt
where temprownumber>5


这是什么意思呢?分解一下

首先将用户输入的sql语句转稍稍修改
在select后添加top 开始位置+条数变成
再外加一列tempcolum,变成这样
sql code
select top 20 tempcolumn=0,* from clazz


嵌套一层,这样便可查询出行号
   刚才那个列就是用来这里order by用的
(也不知道sqlserver的row_number函数为什么必须要order by)
sql code
select row_number()over(order by tempcolumn)temprownumber,*
from (修改过的查询)t


再套一层,过滤掉行号小于开始位置的行
sql code
select * from (第二层)tt
where temprownumber>10


 

 

原创粉丝点击