• 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();
    }    
  • 相关阅读:
    springboot 2.4.5 redis 配置类+缓存
    华为ensp模拟器 提示40 错误问题
    Nodejs
    Python PermissionError:[Errno 13]权限被拒绝 [winerr 5]
    Window10的linux docker 安装(wsl版本)
    window10的 Linux 子系统ssh配置
    vue3.0中provide和inject实现响应式传值
    正确开启vue3.0调试工具vue-devtools
    vue动态设置组件样式
    element-ui菜单导航的三种递归写法(三)
  • 原文地址:https://www.cnblogs.com/superFish2016/p/6834250.html
Copyright © 2020-2023  润新知