zoukankan      html  css  js  c++  java
  • 子查询分页

    分页的sql脚本是2013年大实训的时候老师讲的,今天把它整理出来。

    数据库就用Northwind数据库。就用Orders表为例子吧,假设每页都显示10条记录。

    先从简单的脚本开始吧。先取到第一页的数据。

    SELECT TOP 10 * FROM dbo.Orders

    第二页的数据

    SELECT TOP 10 * FROM dbo.Orders WHERE OrderID NOT IN (SELECT TOP 10 OrderID FROM dbo.Orders)

    第三页的数据

    SELECT TOP 10 * FROM dbo.Orders WHERE OrderID NOT IN (SELECT TOP 20 OrderID FROM dbo.Orders)

     由此可以推断出,第N页的数据为

    SELECT TOP 10 * FROM dbo.Orders WHERE OrderID NOT IN (SELECT TOP (N-1)*10 OrderID FROM dbo.Orders)

    写成通用的SQL语句如下:

    BEGIN
        DECLARE @PageSize INT   --每页显示条数
        DECLARE @PageIndex INT    --页码(从1开始)
        SET @PageSize = 10
        SET @PageIndex = 4
        SELECT TOP ( @PageSize )
                *
        FROM    dbo.Orders
        WHERE   OrderID NOT IN ( SELECT TOP ( ( @PageIndex - 1 ) * @PageSize )
                                        OrderID
                                 FROM   dbo.Orders
                                 ORDER BY OrderID ASC )
        ORDER BY OrderID ASC
    END

    写成存储过程如下:

    --存储过程
    CREATE PROCEDURE P_GetPagedOrders1
        @PageSize INT ,             --每页显示条数
        @PageIndex INT ,            --页码(从1开始)
        @RecordCount INT OUTPUT ,    --数据总数
        @PageCount INT OUTPUT        --总页数
    AS
        BEGIN
            --获取数据总数
            SELECT  @RecordCount = COUNT(1)
            FROM    dbo.Orders
            --计算总页数
            SET @PageCount = @RecordCount / @PageSize
            IF @RecordCount % @PageSize > 0
                BEGIN
                    SET @PageCount = @PageCount + 1
                END
            --获取当前页的数据
            SELECT TOP ( @PageSize )
                    *
            FROM    dbo.Orders
            WHERE   OrderID NOT IN ( SELECT TOP ( ( @PageIndex - 1 ) * @PageSize )
                                            OrderID
                                     FROM   dbo.Orders
                                     ORDER BY OrderID ASC )
            ORDER BY OrderID ASC
        END

    测试存储过程

    DECLARE @RecordCount INT ,
            @PageCount INT
    
    EXEC dbo.P_GetPagedOrders1
            @PageSize = 10, 
            @PageIndex = 1,
            @RecordCount = @RecordCount OUTPUT, 
            @PageCount = @PageCount OUTPUT
    
    SELECT  @RecordCount AS N'@RecordCount' ,
            @PageCount AS N'@PageCount'


    测试结果如下

  • 相关阅读:
    Online ddl 工具之pt-online-schema-change
    【MySql】mysql 慢日志查询工具之mysqldumpslow
    赶集网mysql开发36条军规
    MySQL数据库高并发优化配置
    mysql的表分区
    mysql 如果处理货币金钱类型
    bootstrab table+表格 select可编辑完整实例
    mongoDb 给表添加+ 删除字段
    mongoDb +Java+springboot
    java+数据库+D3.js 实时查询人物关系图
  • 原文地址:https://www.cnblogs.com/jackylovewendy/p/4460405.html
Copyright © 2011-2022 走看看