zoukankan      html  css  js  c++  java
  • rownum浅谈(二)

    上篇说到rownum和order by及索引列的关系,明白了通过构建一个子查询把查询结果固定住再取数就可以了 。还是取最近10条创建的用户:

    select * from (select u.* from t_user u order by u.c_createdate desc) where rownum <= 10;

    这样的话就不用管order by后面的字句是否有索引,都会先执行排序再标记rownum,就能得到想要的结果了。
    如果想要得到大于10条呢,是不是只要改成>10就可以了,试试先

    select * from (select u.* from t_user u order by u.c_createdate desc) where rownum > 10;

    结果是一条数据也没有,为什么呢?因为where字句后面是条件语句,rownum>10为真为假?因为rownum始终是从1开始的,第一条1>10为假,第二条的rownum又成了1,继续判断,依次类推,所以对任何rownum大于1的执行语句都查不到任何数据,如果等于1的话就返回第一条查到的数据。
    同理 !=10 返回前10条数据,rownum >0 或者 rownum>= 1返回所有数据。因此只要理解了rownum是从1开始,条件成立后依次加1就可以了。
    如果想要查询大于10条的数据呢,同理,只要“固定住rownum”,把它当做一个列来使用就可以了。

    select * from (select rownum as rn,m.* from (select u.* from t_user u order by u.c_createdate desc) m )n where n.rn > 2;

    那么在实际应用中,分页的话需要取一段数据,即需要大于、小于取数据,同理可以知道,只要构造子查询,让rownum固定下来就可以查询某段数据了。

    select * from (select rownum as r,m.* from (select rownum as rn,u.* from t_user u order by u.c_createdate desc)m where m.rn < 20 ) where r > 10;

    或者封装成一个方法可以进行调用:

    public static String pageSql(int start, int end, String sql) {
        StringBuffer sbu = new StringBuffer();
        sbu.append(" SELECT * FROM (SELECT A.*,ROWNUM RN ")
        .append(" FROM (")
        .append(sql)
        .append(" ) A WHERE ROWNUM <")
        .append(end)
        .append(" ) WHERE RN >")
        .append(start);
        return sbu.toString();
    }    
  • 相关阅读:
    终于等到你---订餐系统之负载均衡(nginx+memcached+ftp上传图片+iis)
    订餐系统之同步饿了么商家订单
    订餐系统之同步口碑外卖商家菜单与点点送订单
    基于SuperSocket的IIS主动推送消息给android客户端
    基于mina框架的GPS设备与服务器之间的交互
    订餐系统之微信支付,踩了官方demo的坑
    订餐系统之自动确认淘点点订单
    订餐系统之Excel批量导入
    移除首页->重回首页
    订餐系统之获取淘宝外卖订单
  • 原文地址:https://www.cnblogs.com/superFish2016/p/6834250.html
Copyright © 2011-2022 走看看