各种常见数据库分页实现(转)

因为数据量过大,如果一次性查询会耗用大量时间以及性能,因此对数据进行分页显示变得尤为重要,以下就列出一些常用数据库的sql分页实现。

1.MySQL实现分页 
MySQL实现分页效果比较简单,只有一个limit关键字就可以解决。

示例:SELECT username,password FROM tb_user WHERE id = 1 LIMIT 100,10; 
具体:select * from tableName where 条件 limit 当前页码*页面容量-1,页面容量

2.Oralce实现分页

SELECT * 
  FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM tableName order by id) A WHERE ROWNUM <=20) 
WHERE RN >= 11;

select count(*) from tableName where 条件

3.Sqlserver实现分页

sqlserver由于版本的不同,分页的实现方式也各不相同。

SQL 2000 用临时表解决,通过在临时表中增加自增列解决RowNumber。 
DECLARE @Start INT 
DECLARE @End INT 
SELECT @Start = 14000,@End = 14050

CREATE TABLE #employees (RowNumber INT IDENTITY(1,1), 
LastName VARCHAR(100),FirstName VARCHAR(100), 
EmailAddress VARCHAR(100))

INSERT INTO #employees (LastName, FirstName, EmailAddress) 
SELECT LastName, FirstName, EmailAddress 
FROM Employee 
ORDER BY LastName, FirstName, EmailAddress 
SELECT LastName, FirstName, EmailAddress 
FROM #employees 
WHERE RowNumber > @Start AND RowNumber <= @End

DROP TABLE #employees

GO  

SQL 2005/2008 由于支持了Row_Number于是通过派生表的方式解决(两个嵌套) 
DECLARE @Start INT 
DECLARE @End INT 
SELECT @Start = 14000,@End = 14050

SELECT LastName, FirstName, EmailAddress 
FROM (SELECT LastName, FirstName, EmailAddress, 
ROW_NUMBER() OVER (ORDER BY LastName, FirstName, EmailAddress) AS RowNumber 
FROM Employee) EmployeePage 
WHERE RowNumber > @Start AND RowNumber <= @End 
ORDER BY LastName, FirstName, EmailAddress 
GO 
  

SQL 2005/2008 或者用CTE的方式实现,和派生表一样,就是好看点,执行计划都一样。 
DECLARE @Start INT 
DECLARE @End INT 
SELECT @Start = 14000,@End = 14050; 
WITH EmployeePage AS 
(SELECT LastName, FirstName, EmailAddress, 
ROW_NUMBER() OVER (ORDER BY LastName, FirstName, EmailAddress) AS RowNumber 
FROM Employee) 
SELECT LastName, FirstName, EmailAddress 
FROM EmployeePage 
WHERE RowNumber > @Start AND RowNumber <= @End 
ORDER BY LastName, FirstName, EmailAddress 
GO 
   
SQL SERVER 2012 比较给力支持了OFFSET,于是一个Select结束战斗,另外在2012里,如果前面加上TOP(50),那么执行计划就会少读很多行数据(读的精准了),提高性能。 
SELECT top(50) LastName, FirstName, EmailAddress 
FROM Employee 
ORDER BY LastName, FirstName, EmailAddress 
OFFSET 14000 ROWS 
FETCH NEXT 50 ROWS ONLY;

4.DB2实现分页 
Db2实现分页与SQL Server类似, 但是可以不对资料排序(起始位置从1开始)

对资料排序 
select * from ( 
    select t.*, ROW_NUMBER() OVER(ORDER BY CARD_ID asc) AS ROWNUM from CARD t ) a 
where ROWNUM > 20 and ROWNUM <=30

不对资料排序 
select * from ( 
    select t.*, ROW_NUMBER() OVER() AS ROWNUM from CARD t ) a 
where ROWNUM > 20 and ROWNUM <=30

以上为各种常见数据库分页语句,留存备用。

http://lafecat.iteye.com/blog/2186265

时间: 2024-10-15 09:03:39

各种常见数据库分页实现(转)的相关文章

数据库分页学习

近期项目使用分页,学习了下常见几种数据库下分页查询语句,如下[转载于作者:守护熊猫]: 1.oracle数据库分页 select * from (select a.*,rownum rc from 表名 where rownum<=endrow) a where a.rc>=startrow 2.DB2数据库分页 Select * from (select rownumber() over() as rc,a.* from (select * from 表名 order by 列名) as a

数据库分页查询

分页语句: Oracle: --这种分页查询方式不仅仅是针对单表的简单查询,对于最内层查询是复杂的 --多表联合查询或最内层查询包含排序的情况一样有效 SELECT * FROM ( SELECT ROWNUM RN , T.*  FROM (SELECT * FROM FTNEMR.PATIENT_VISIT) T WHERE ROWNUM <= 40 ) WHERE RN >= 21 ORDER BY PATIENT_ID; --这种方式比上面的方式要性能要低很多 SELECT * FRO

数据库分页

数据库分页技术能够帮助浏览者更好的查看信息,不同数据库实现分页时的方法也各有不同.本文主要介绍几种不同数据库分页显示的实现方法以及高效率分页技术的三个方案. 不同数据库分页技术的实现代码: 1.Oracle:select * from ( select query.*, rownum rn from ( query_SQL ) query where rn =< max) where rn >= min 2.SQL Server:select top @pagesize * from tabl

180多个数据库版本一键切换,PHPWAMP8.8.8.8(支持切换任意数据库,全面支持mysql等常见数据库)

PHPWAMP8.8.8.8版本支持一键切换数据库的PHP集成环境,纯绿色 支持切换任意数据库,默认全面支持mysql等常见数据库) 最新最旧版本的数据库都可以切换,同时运行不同版本的数据库! 完美兼容任何集成环境,多开,群开无压力,满足各种变态测试! 只需点击相关设置,切换你想要的任意版本即可,真正的一键自定义! 在一键自定义同时,完美兼顾用户的自主修改,各种DIY自定义 1.支持一键自定义设置MYSQL版本,180多个MYSQL历史版本随意切换! 2.优化旧版本的"700多个PHP版本随意切

MySQL、SqlServer、Oracle三大主流数据库分页查询 (MySQL分页不能用top,因为不支持)

一. MySQL 数据库 分页查询MySQL数据库实现分页比较简单,提供了 LIMIT函数.一般只需要直接写到sql语句后面就行了.LIMIT子 句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两个参数, 第一个参数指定返回的第一行在所有数据中的位置,从0开始(注意不是1),第二个参数指定最多返回行数.例如:select * from table WHERE … LIMIT 10; #返回前10行select * from table WHERE … LIMIT

几种常见SQL分页方式效率比较-转

原文地址:几种常见SQL分页方式效率比较 分页很重要,面试会遇到.不妨再回顾总结一下. 1.创建测试环境,(插入100万条数据大概耗时5分钟). create database DBTestuse DBTest --创建测试表create table pagetest(id int identity(1,1) not null,col01 int null,col02 nvarchar(50) null,col03 datetime null) --1万记录集declare @i intset

常见数据库url和driver

oracle driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@localhost:1521:数据库名"sqlserver driver="com.microsoft.jdbc.sqlserver.SQLServerDriver" url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=数据库名&

各种数据库的数据库分页查询

数据查询的时候,才用数据库分页,能减轻数据过大对程序的影响,避免内存溢出的出现. 下面各种数据库的字段说明: 1.表historyPacking,包含字段cardNumber flag... 2.表pickaddress,包含字段 pickaddressid... 1.sql server 2005(不支持2000,支持2005以上版本): select * from (select *, ROW_NUMBER() OVER(Order by a.time DESC ) AS RowNumber

Mybatis高级教程之数据库分页插件

mybatis分页 mybatis的数据库分页是基于内存实现的,这样不符合我们实际的应用场景,所有我们需要自己实现分页. 刚开始和朋友们争论是使用插件实现,还是使用原生的sql实现,最后公说公有理婆说婆有理,也没有争论出什么来. 但是最后想想我们使用mybatis的初衷不就是抛弃原生jdbc的繁琐,让mybatis替我们做了繁杂的步骤, 那么mybatis的分页必须通过mybatis内部的一些机制来实现才能满足我们的需要. Mybatis高级教程之数据库分页插件