sqlite、mysql、sqlserver、postgresql、oracle分页sql汇总

sqlite、mysql、sqlserver、postgresql、oracle分页sql汇总

sqlite、mysql、sqlserver、postgresql、oracle分页sql汇总

数据库的种类很多,对于关系型数据库,有sqlite、mysql、oracle、postgresql、sqlserver等,那么他们在进行分页的时候的sql写法是否一致呢,今天我们来为大家整理一下。

一、sqlite分页sql

select * from users order by id limit 10 offset 0;  //offset代表从第几条记录“之后“开始查询,limit表明查询多少条结果

二、mysql分页sql

select * from users order by id limit 0,10;  //limit第一个参数表示从多少行开始,第二产参数表示取多少行

三、sqlserver分页sql

第一种采用offset fetch next方式,2012版本之上支持

select * from users order by id offset 0 rows fetch next 10 rows only ;;  //offset A rows ,将前A条记录舍去,fetch next B rows only ,向后在读取B条数据

第二种,利用row_number() over(order by id)函数计算出行数,选定相应行数返回,SQL server 2005版本以上才支持

-- 分页查询第2页,每页有10条记录
select top 10 * 
from (select row_number() 
over(order by sno asc) as rownumber,* 
from user) temp_row
where rownumber>10;

第三种,max主键,先top前11条行记录,然后利用max(id)得到最大的id,之后再重新再这个表查询前10条,不过要加上条件,where id>max(id)

-- 分页查询第2页,每页有10条记录
select top 10 * 
from user
where sNo>=
(select max(sNo) 
from (select top 11 sNo
from user
order by  sNo asc) temp_max_ids) 
order by sNo;

第二种与第三种写法有些嵌套,还是喜欢第一种写法,与其他数据库有点相似,简洁好用

四、postgresql分页sql

他跟sqlite一样

select * from users order by id limit 10 offset 0;  //offset代表从第几条记录“之后“开始查询,limit表明查询多少条结果

五、oracle

Oracle中实现分页的方法大致分为两种,用ROWNUM关键字和用ROWID关键字

第一种。用ROWNUM关键字

--ROWNUM
select * from (
    select rownum as row_no, t.* from  user t  where 
    rownum <= pageSize*currentPageNo  )
b where b.row_no > pageSize*(currentPageNo -1); 

第二种,用ROWID关键字

--ROWID
SELECT *
  FROM (SELECT RID
          FROM (SELECT R.RID, ROWNUM LINENUM
                  FROM (SELECT ROWID RID
                          FROM TABLE1
                         WHERE TABLE1_ID = XX
                         ORDER BY order_date DESC) R
                 WHERE ROWNUM <= 20)
         WHERE LINENUM >= 10) T1,
       TABLE1 T2
 WHERE T1.RID = T2.ROWID;


{{collectdata}}

网友评论0