oracle分段查询

rownum

在做分段查询的时候,在mysql中可以使用 limit a,b 这种方式进行分段查询,同样的分页查询也是类似的道理,但是在ORACL中就不太一样了,如果在ORACLE中使用 limit 就会报错命令语句未正确结束,造成这个问题的原因就是在ORACLE中不存在 limit ,那么同样的要想实现 limit分段查询的 可以使用ORACLE中的关键字 rownum

下面就用一个实际的例子举例说明

  • 例如我现在要查询一些符合条件的数据,那么我使用了如下的SQL进行查询,查询出了总计103条数据
  • 但是现在需求改变,不查总的数据,而是每次只查询指定数量的数据,这时候或许就会有人想既然可以使用rownum进行类似于limit这样的查询那就使用 rownum a,b 这种方式是不可取的,因为语法就不对。
  • 那百度后发现rownum可以使用 >或< 进行取范围值,那就直接在条件后面加上 rownum >=0 and rownum <=10 如果这样查确实能查出前10条数据,那如果换成 rownum >=10 and rownum <=20 这样就无法查询出 第10条到第20条 而是为空集
  • 所以想使用rownum实现分段查询那么就要理解rownum的原理并使用到子查询,其实rownum就是行号。例如上面我使用该条SQL已经能查询出总的数据量是103条,那么就可以在这个SQL里面加入rownum这个字段并且取一个别名,并且 将这条SQL作为一个查询的子查询

  • 如下所示,在以上查询的SQL外面套一个查询,也就是将前面查询出103条数据的SQL作为一个子查询
  • select
    	( `查询出了103条数据的SQL语句`  ) t
    where
    	t.rn between 101 and 200
    

    并且在查询出为103条数据的查询字段中加入rownum rn 其中rn是rownum的别名,上面的t是子查询的别名,而101,200就是查询的范围

  • 总的SQL如下
  • 通过以上的这种方式就实现了ORACLE中类似于limit的分段查询,同样的如果考虑到效率问题可以将select * 换成

    select 字段,而这些字段就是子查询中查询的字段值。

  • 写好总的查询SQL,就是查询所有数据的
  • 在该条SQL里面加入rownnum字段,并且给该条子查询SQL取别名
  • 将该条SQL做为子查询嵌套在外侧
  • 使用子查询别名.rownum别名的方式给定一个范围
  • 分类:
    后端
  •