• SQL点点滴滴_SQL分页查询


    假如tb_customer表中的数据量非常大,在显示时要分页显示而且每页只显示10条信息。为了效果我们取第三页的数据。

          

    方法一:遍历两次表,取不同的数据。

    select top 10 * from tb_customer(nolock)
    where c_no not in(select top 20 c_no from tb_customer)
    order by c_no

          

    方法解析:方先取出前20条的c_no(前两页),排除前20条数据的c_no,然后在剩下的数据里面取出前10条数据。

    缺点:遍历表中所有数据两次,数据量大时性能不好。

    方法二:获取前两页的最大值,然后获取大于最大值的值。

    select top 10 * from tb_customer(nolock)
    where c_no >(select max(t.c_no) from (select top 20 c_no from tb_customer order by c_no) t)
    order by c_no

          

    方法解析:先取出前20条数据的c_no,然后取出c_no里的最大值,再从数据里面取出大于前20条c_no的最大值 的前10条数据。

    缺点:性能比较差,和方法一大同小异。

    方法三:计算序列值,然后根据虚列值获取数据。

    select * from
    (select *,row_number() over (order by c_no) c_no_id from tb_customer) t
    where t. c_no_id between (10*(3-1)+1) and 10*3

          

     方法解析:使用 ROW_NUMBER() 函数,这个方法性能比前两种方法要好,只会遍历一次所有的数据。适用于Sql Server 2000之后的版本(不含)。

    方法四:使用OFFSET/FETCH NEXT分页。

    select * from tb_customer(nolock)
    order by c_no
    offset 10*2 rows fetch next 10 rows only

          

    方法解析:适用于Sql Server 2008之后的版本(不含)。

    offset 20 rows fetch next 10 rows only 这句代码我的理解是:跳过前面20条数据(前2页)从下一条开始取10条数据。

    个人感觉这个方法比使用 ROW_NUMBER() 函数的方法要好(从代码方面来看,代码也少很多),性能方面待测试。

    不过,看语句编写的复杂程度,最后两种方法比较简单,性能肯定是远超前面两种方法的,具体的还得看实际使用情况。

  • 相关阅读:
    LCS LIS
    补个线段树
    洛谷1522
    AC自动机
    WF 2017 I
    WF2017 E
    最小生成树计数 基尔霍夫矩阵树定理
    bitonic tour luogu1523
    code+11月月赛
    模拟退火
  • 原文地址:https://www.cnblogs.com/Zeros/p/6040039.html
Copyright © 2020-2023  润新知