Oracle, DB2 及 MySQL 分页查询写法
2009-11-16 18:20
477 查看
现在在WEB 应用中使用分页技术越来越普遍了,其中利用数据库查询分页是一种效率比较高的方法,
下面列出了Oracle, DB2 及 MySQL 分页查询写法。
一:Oracle
select * from (select rownum,name from table where rownum <=endIndex )
where rownum > startIndex
二:DB2
DB2分页查询
SELECT * FROM (Select 字段1,字段2,字段3,rownumber() over(ORDER BY 排序用的列名 ASC) AS rn from 表名) AS a1 WHERE a1.rn BETWEEN 10 AND 20
以上表示提取第10到20的纪录
select * from (select rownumber() over(order by id asc ) as rowid from table where rowid <=endIndex ) AS a1
where a1.rowid > startIndex
三:MySQL
select * from table limit start,pageNum
SELECT EVENTID , EVENTNAME , CREATETIME , ELAPSEDTIME , REPEATCOUNT , MESSAGE , LOCALINSTANCEID , STATUS , MEMO FROM(SELECT rownumber() OVER (ORDER BY CREATETIME ASC) AS rowid FROM MS_EVENT WHERE rowid <=20) as a1 WHERE a1.rowid >10
SELECT * FROM (SELECT EVENTID , EVENTNAME , CREATETIME , ELAPSEDTIME , REPEATCOUNT , MESSAGE , LOCALINSTANCEID , STATUS , MEMO,
ROWNUMBER() OVER (ORDER BY CREATETIME ASC) AS rn FROM MS_EVENT) AS a1 WHERE a1.rn BETWEEN 10 and 20
--------------------------------------------------------------------
1. 标准的rownum分页查询使用方法:
select *
from (select c.*, rownum rn from content c)
where rn >= 1
and rn <= 5
2. 但是如果, 加上order by addtime 排序则数据显示不正确
select *
from (select c.*, rownum rn from content c order by addtime)
where rn >= 1
and rn <= 5
解决方法,再加一层查询,则可以解决,
select *
from (select rownum rn, t.*
from (select title, addtime from content order by addtime desc) t)
where rn >= 1
and rn <= 5
如果要考虑到效率的问题,上面的还可以优化成(主要两者区别)
select *
from (select rownum rn, t.*
from (select title, addtime from content order by addtime desc) t
where rownum <= 10)
where rn >= 3
----------------------------------------------------------------------
如果查询结果需要分页,从效率上讲,下面的效率应该比较高(粉红色表示需要根据实际情况填充的地方)
三类数据库中进行分页查询的高效率方法(目前来看):
Oracle: SELECT * FROM (
SELECT MY_TABLE.*,ROWNUM AS MY_ROWNUM FROM (
/** 括号里写实际的需要查询的SQL语句**/
) AS MYTABLE WHERE ROWNUM <=200/**这里是一页中的最后一条记录**/
/) WHERE MY_ROWNUM>=10 /**这里是一页中的第一条记录**/
SQLServer: SELECT * FROM (
SELECT TOP 页面容量 * FROM (
SELECT TOP 页面容量*当前页码 * FROM
表 WHERE 条件 ORDER BY 字段A ASC
)AS TEMPTABLE1 ORDER BY 字段A DESC
) AS TEMPTABLE2 ORDER BY 字段A ASC
MYSQL: SELECT 语句 LIMIT 页面的第一条记录-1,页面容量
下面列出了Oracle, DB2 及 MySQL 分页查询写法。
一:Oracle
select * from (select rownum,name from table where rownum <=endIndex )
where rownum > startIndex
二:DB2
DB2分页查询
SELECT * FROM (Select 字段1,字段2,字段3,rownumber() over(ORDER BY 排序用的列名 ASC) AS rn from 表名) AS a1 WHERE a1.rn BETWEEN 10 AND 20
以上表示提取第10到20的纪录
select * from (select rownumber() over(order by id asc ) as rowid from table where rowid <=endIndex ) AS a1
where a1.rowid > startIndex
三:MySQL
select * from table limit start,pageNum
SELECT EVENTID , EVENTNAME , CREATETIME , ELAPSEDTIME , REPEATCOUNT , MESSAGE , LOCALINSTANCEID , STATUS , MEMO FROM(SELECT rownumber() OVER (ORDER BY CREATETIME ASC) AS rowid FROM MS_EVENT WHERE rowid <=20) as a1 WHERE a1.rowid >10
SELECT * FROM (SELECT EVENTID , EVENTNAME , CREATETIME , ELAPSEDTIME , REPEATCOUNT , MESSAGE , LOCALINSTANCEID , STATUS , MEMO,
ROWNUMBER() OVER (ORDER BY CREATETIME ASC) AS rn FROM MS_EVENT) AS a1 WHERE a1.rn BETWEEN 10 and 20
--------------------------------------------------------------------
1. 标准的rownum分页查询使用方法:
select *
from (select c.*, rownum rn from content c)
where rn >= 1
and rn <= 5
2. 但是如果, 加上order by addtime 排序则数据显示不正确
select *
from (select c.*, rownum rn from content c order by addtime)
where rn >= 1
and rn <= 5
解决方法,再加一层查询,则可以解决,
select *
from (select rownum rn, t.*
from (select title, addtime from content order by addtime desc) t)
where rn >= 1
and rn <= 5
如果要考虑到效率的问题,上面的还可以优化成(主要两者区别)
select *
from (select rownum rn, t.*
from (select title, addtime from content order by addtime desc) t
where rownum <= 10)
where rn >= 3
----------------------------------------------------------------------
如果查询结果需要分页,从效率上讲,下面的效率应该比较高(粉红色表示需要根据实际情况填充的地方)
三类数据库中进行分页查询的高效率方法(目前来看):
Oracle: SELECT * FROM (
SELECT MY_TABLE.*,ROWNUM AS MY_ROWNUM FROM (
/** 括号里写实际的需要查询的SQL语句**/
) AS MYTABLE WHERE ROWNUM <=200/**这里是一页中的最后一条记录**/
/) WHERE MY_ROWNUM>=10 /**这里是一页中的第一条记录**/
SQLServer: SELECT * FROM (
SELECT TOP 页面容量 * FROM (
SELECT TOP 页面容量*当前页码 * FROM
表 WHERE 条件 ORDER BY 字段A ASC
)AS TEMPTABLE1 ORDER BY 字段A DESC
) AS TEMPTABLE2 ORDER BY 字段A ASC
MYSQL: SELECT 语句 LIMIT 页面的第一条记录-1,页面容量
相关文章推荐
- Oracle, DB2 及 MySQL 分页查询写法
- Oracle, DB2 及 MySQL 分页查询写法
- Oracle、MYSQL、sql server和DB2分页查询写法
- 【转】Oracle, DB2 及 MySQL 分页查询写法
- Oracle、SQL和DB2分页查询写法介绍
- Oracle、SQL和DB2分页查询写法介绍
- Oracle、SQL和DB2分页查询写法介绍
- oracle mysql 的mybatis 逆向工程中的分页查询的写法
- DB2,Oracle,SQL server,Mysql分页查询语句
- 各种数据库(MYSQL、Oracle、DB2、SQL Server、PostgreSQL)的分页查询语句
- Oracle、MySql、SQLServer、DB2 数据分页查询
- 几种常用数据库(SQLServer Oracle db2 mysql等)分页SQL的写法总结
- Oracle、SQL和DB2分页查询写法介绍
- MYSQL,Oracle,DB2,SQLServer4中数据库的分页写法
- 数据库MySQL、Oracle、SQLServer、db2分页查询语句
- Oracle、SQL和DB2分页查询写法介绍
- 总结Oracle,MySql,SQLServer的分页查询总结
- oracle、sql server、mysql、db2 查询 区别
- Oracle、MySql、SQLServer 数据分页查询
- Mybatis中oracle、mysql、db2、sql server的like模糊查询