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();
    }    
  • 相关阅读:
    多线程--同步--方法块和同步块synchronized
    CentOS7.6安装Nodejs(Npm)
    [原][译]关于osgEarth::VirtualProgram说明
    [转]opengl的学习网站
    [转]OpenGL中的功能与OSG对应功能
    [原]最简单的c语言,出错输出,日志打印 以及 C预定义的宏
    [转]netcdf入门
    [NetCDF][C++] 使用NetCDF 的接口读取数值
    [python] pip安装国外软件库(包)失败,解决方案
    [原][python]安装python,读取、遍历excel表格
  • 原文地址:https://www.cnblogs.com/superFish2016/p/6834250.html
Copyright © 2011-2022 走看看