zoukankan      html  css  js  c++  java
  • 各种常见数据库分页实现(转)

    因为数据量过大,如果一次性查询会耗用大量时间以及性能,因此对数据进行分页显示变得尤为重要,以下就列出一些常用数据库的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

  • 相关阅读:
    一句话解释c#中的特性,你了解多少
    CentOS虚拟机如何设置共享文件夹,并在Windows下映射网络驱动器?
    samba服务器配置及window网络磁盘映射
    PHP中各种Hash算法性能比较
    Redis持久化
    设置redis主从出现的问题
    Redis启动多端口、运行多实例
    Redis学习手册(主从复制)
    tengine/nginx-tomcat动静分离遇到的问题
    使用 Git Hooks 实现自动项目部署
  • 原文地址:https://www.cnblogs.com/softidea/p/4303161.html
Copyright © 2011-2022 走看看