zoukankan      html  css  js  c++  java
  • 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() 函数的方法要好(从代码方面来看,代码也少很多),性能方面待测试。

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

  • 相关阅读:
    PHP Session 变量
    PHP Cookie是什么
    PHP 文件上传
    PHP 文件处理
    PHP include 和 require 语句
    Mac pycharm专业版安装以及破解方法
    bzoj3946: 无聊的游戏
    win10 uwp 九幽图床
    win10 uwp 九幽图床
    git无法pull仓库refusing to merge unrelated histories
  • 原文地址:https://www.cnblogs.com/Zeros/p/6040039.html
Copyright © 2011-2022 走看看