博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
各种数据库分页查询方法
阅读量:5286 次
发布时间:2019-06-14

本文共 3580 字,大约阅读时间需要 11 分钟。

具体实现中,根据所用数据库、数据量、实现分页方式,选择分页实现快的方式实现。

一、MYSQL分页查询方法

      MYSQL分页查询主要使用其自带的limit函数,但需根据查询量来决定具体的使用方式,如只有几千或几万数据,则直接用 limit m,n方式,

      如数据量较多,则要注意limit的使用方式。

      // limit m , n:从第 m 条数据开始,获取 n 条数据

     1、数据量少的方式:select * from tablename limit m,n;

     // limit m , n:m 可省略,省略或默认从结果集的第 0 条 开始

     2、数据量多的方式:

             // 从490000开始取10条

            a.  select * from tablename where id>=(select id from tablename limit 490000,1) limit 10 ; 

            b.  select * from tablename limit 490000,10 ;

          a 方式要比 b方式快

二、DB2分页查询方法

      DB2分页查询方法主要以 rownumber() over() 函数方式实现,如下:

      select * from(select 字段1,字段2...rownumber() over(order by id desc) as rn from tablename where...) as t1

      where t1.rn between m and n / t1.rn >m and t1.rn <= n;

三、ORACLE分页查询方法

     ORACLE分页查询主要以rownum关键字和rownumber() over()函数实现,如下:

     1、rownum关键字--无排序--获取 n 到 m条数据

     a. 在查询的第二层通过ROWNUM <= m 来控制最大值,在查询的最外层控制最小值:

     select * from (

                    select a.*, rownum rn from (

                                            select * from tablename) a

                                                      where rownum <= m)

                                                                  where rn >= n

     b.  直接在最外层控制最大值最小值

      select * from (

                    select a.*, rownum rn from (

                                            select * from tablename) a)

                                                                  where rn between n and m

      //在绝大多数情况下,a方式要比b方式快的多

     2、rownum关键字--需排序--获取 n 到 m条数据

      // 错误方式

     select * from

     (select t.*,rownum rn from mytable t order by t.id) b

     where b.row_num between n and m

     //错误原因:上面sql会先执行 rownum rn产生行号,再 执行order by 排序,但是最后结果通过rn即行号获取,order by排序不起作用

     // 正确做法:先排序,对排序后的结果生成行号,则根据rn获取结果获取到的是排序后的结果

     //正确方式:再加一层先排序

     select * from 

     (select a.*, rownum rn from (select * from tablename order by id)a)b

     where b.rn between n and m

     3、rownum() over()方式--同db2方式

     select * from(select 字段1,字段2...rownumber() over(order by id desc) as rn from tablename where...) as t1

      where t1.rn between m and n / t1.rn >m and t1.rn <= n;

四、SQL SERVER分页查询方法

      sql server 2005及以上版本,可用 rownum() over()方式实现

      不可用rownum() over()方式版本用top关键字方式实现

      select top num * from tablename where ..........

五、MONGODB分页查询方法

     mongoDB的分页查询是通过limit(),skip(),sort()这三个函数组合进行分页查询的

     用skip方法查询大量数据的时候速度慢

      page1 = db.things.find().limit(20)

    page2 = db.things.find().skip(20).limit(20)

    page3 = db.things.find().skip(40).limit(20)
     find(查询条件),skip(跳过多少条数据),limit(查询多少条数据),sort(排序依据):sort({"age":1})1--正序,-1--反序
 
     MySQL对应mongodb:
     查询:

       MySQL:SELECT * FROM user

       Mongo: db.user.find()

       MySQL:SELECT * FROM user WHERE name = 'starlee'

       Mongo: db.user.find({'name' : 'starlee'})

     插入:

     MySQL:INSERT INOT user (`name`, `age`) values ('starlee',25)

     Mongo:db.user.insert({'name' : 'starlee', 'age' : 25})

     删除:

     MySQL:DELETE * FROM user

     Mongo:db.user.remove({})

     MySQL:DELETE FROM user WHERE age < 30

     Mongo:db.user.remove({'age' : {$lt : 30}})

     更新:

     MySQL:UPDATE user SET `age` = 36 WHERE `name` = 'starlee'

     Mongo:db.user.update({'name' : 'starlee'}, {$set : {'age' : 36}})

     MySQL:UPDATE user SET `age` = `age` + 3 WHERE `name` = 'starlee'

     Mongo:db.user.update({'name' : 'starlee'}, {$inc : {'age' : 3}})

==============others=======================

     MySQL:SELECT COUNT(*) FROM user WHERE `name` = 'starlee'

     Mongo:db.user.find({'name' : 'starlee'}).count()

 

     MySQL:SELECT * FROM user limit 10,20

     Mongo:db.user.find().skip(10).limit(20)

 

     MySQL:SELECT * FROM user WHERE `age` IN (25, 35,45)

     Mongo:db.user.find({'age' : {$in : [25, 35, 45]}})

 

     MySQL:SELECT * FROM user ORDER BY age DESC

     Mongo:db.user.find().sort({'age' : -1})

 

     MySQL:SELECT DISTINCT(name) FROM user WHERE age > 20

     Mongo:db.user.distinct('name', {'age': {$lt : 20}})

 

     MySQL:SELECT name, sum(marks) FROM user GROUP BY name

     Mongo:

      db.user.group({

      key : {'name' : true},

     cond: {'name' : 'foo'},

     reduce: function(obj,prev) { prev.msum += obj.marks; },

     initial: {msum : 0}

    });

     MySQL:

    SELECT name FROM user WHERE age < 20

    Mongo:db.user.find('this.age < 20', {name : 1})

     

      

 

  

     

 

      

 

 

  

转载于:https://www.cnblogs.com/lxfeng/p/4256502.html

你可能感兴趣的文章
【算法•日更•第三十九期】迭代加深搜索:洛谷SP7579 YOKOF - Power Calculus 题解...
查看>>
【算法•日更•第四十一期】组合与排列
查看>>
【算法•日更•第四十三期】QQ for linux
查看>>
【算法•日更•第四十二期】离散傅里叶变换(DFT)
查看>>
【算法•日更•第四十四期】虚二叉树
查看>>
【算法•日更•第四十五期】静态二叉排序树(建立)
查看>>
【算法•日更•第四十六期】二分图(基础)
查看>>
【算法•日更•第四十七期】Mac与windows系统的差别
查看>>
【算法•日更•第四十八期】二分图(匈牙利算法)
查看>>
【算法•日更•第四十九期】双系统
查看>>
【算法•日更•第五十期】二分图(km算法)
查看>>
【算法•日更•第五十一期】知识扫盲:什么是离散化?
查看>>
【算法•日更•第五十二期】知识扫盲:什么是调和数?
查看>>
【算法•日更•第五十三期】知识扫盲:什么是积性函数?
查看>>
【算法•日更•第五十四期】知识扫盲:什么是operator?
查看>>
【算法•日更•第五十五期】知识扫盲:什么是卡常数?
查看>>
【算法•日更•第五十六期】扩展欧几里得算法
查看>>
【算法•日更•第五十七期】快速傅里叶变换(FFT):从入门到放弃
查看>>
【算法•日更】日更内容汇总
查看>>
【数论】莫比乌斯反演Mobius inversion
查看>>