mysql sqlserver oracel分页sql语句
项目一直都用的hibernate,很少对分页查询写sql语句,这次做项目用的mybatis,mybatis的内部分页不是很好,用的是jdbc的游标移动,它是基于内存分页的,所以要自己写sql语句,就总结一下几种主流数据库的分页写法
1. mysql mysql的分页比较简单,mysql数据库提供了分页处理的关键字 例如表的名称叫 procuct
select * from product limit 0,10
limit 后面是两个整数,第一个整数是开始的行号,第二个是要取得数据的记录数,比如上面的sql语句会查询出第一条到第十条记录,它是从开始行号的下一条开始取数据的。
2. sql server sql server 的分页语句稍微复杂点,假如表中有字段 id 用top实现
select top pageSize * from product where id not in (select top (pageNow - 1) * pageSize id from product order by id) order by id
pagesize 就是要取得的记录条数,不过这样的效率不是很高,随着页数的增加速度会慢
sql server 2005 提供了row_number 和over by 函数也可以实现分页
select * from (select row_number() over by(id)
rownum t.* from (select * from product) t where rownum <= pageNow * pageSize)where rownum > (pagenow - 1)* pageSize)
效率还是挺高的 比上面用top效率高,不过只用sql 2005 版本以上的数据库管理系统支持。
2.oracle oracle是用三层嵌套来实现的 ,一直很纳闷,为什么oracel公司不做的简单的,像 mysql 那样多好,不知道为什么要搞这么复杂,oracel为查询的记录提供了一个虚拟列,叫rownum,就是行号
select * from (select rownum,
t.* from (select * from product) t where rownum <= pageNow * pageSize)where rownum > (pagenow - 1)* pageSize)
挺复杂的,希望oracel也提供像mysql 那样的分页sql语句