Oracle中ROWNUM和ORDER BY的优先级比较

1、前言

  公司最近mysql数据库切换oracle,oracle很久没用了有点陌生,刚开始做分页就遇到ROWNUM和ORDER BY的优先级比较。查了资料,网上都说ROWNUM的优先级高于ORDER BY,即先取数据的结果,再对结果进行排序。抱着怀疑的态度写了两天SQL语句,结果有的是ROWNUM的优先级高于ORDER BY,有的是的ORDER BY优先级高于ROWNUM。后来得出结论:ROWNUM和ORDER BY的优先级比较是要分情况的。

2、正题

2、1 order by 索引,主键时,其中lid是主键,执行结果如下,比较可知结果是一样的。

select lid from test where rownum <=10 order by lid desc;

select b.lid from (select a.lid from test  a order by a.lid desc) b where rownum<=10;


2、2 order by 普通列时,其中amount是普通列,执行结果如下,比较可知结果是不一样的。 

1、select amount from test where rownum <=10 order by amount desc;
2、select b.amount from (select a.amount from test  a order by a.amount desc) b where rownum<=10;

  


3、结果

  ROWNUM和ORDER BY的优先级比较是要分情况的,order by 索引,主键时,即可让oracle先按该字段排序,然后再用rownum标号 ;order by 普通列时,先rownum后order by.

时间: 2024-07-30 16:33:12

Oracle中ROWNUM和ORDER BY的优先级比较的相关文章

Oracle中rownum和 order by联合使用导致排序错乱

在使用Oracle进行分页查询的时候,一般情况下我们都会携带很多参数.但是今天发现一个很奇怪的东西,当排序字段不是主键,且多条数据中该排序字段的值均相同的情况下,会出现分页查询的排序顺序和不分页查询的排序顺序不一样的情况.下面直接用SQL来说明一下: 1.原始的查询SQL select ty.countryname,ty.s_adddate from t_d_Country ty order by ty.s_adddate desc; 2.执行分页的查询SQL select * from (se

Oracle中rownum和row_number()的区别

Oracle中 rownum,为符合where条件的输出结果集中现在有多少条记录. where条件中的rownum可以这样理解 select中的rownum可以理解为,将这条记录放到输出结果集中,就在这条记录中加上这个是第几行(输出一行生成一个) row_number() OVER (ORDER BY id),为结果记录集生成后,按给定字段排序后的行号 注意这两者都是在order by条件之前执行的.

【转】oracle中rownum和row_number()

这篇文章主要介绍了oracle中rownum和row_number()的使用方法以及区别和联系,十分的详细,有需要的小伙伴可以参考下. row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的). 与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪劣rownum然后再进行排序,而row_number()在包含排序从句后

关于Oracle中rownum与&lt;=问题

今天在帮一个朋友改写SQL语句,要将原来的Oracle语句改写成MySQL语句,遇到以下的一个语句: select * from(select dp.* from d_item di join  d_product dp on(di.product_id=dp.PRODUCT_ID) order by di.product_num desc) where rownum <= ? 在这个语句中,出现rownum<=?,但是不知道为什么要这样使用.在官方文档中,rownum后只能跟一个常量.平时我

oracle中rownum和row_number()

row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的). 与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪劣rownum然后再进行排序,而row_number()在包含排序从句后是先排序再计算行号码. 一.oracle中rownum 用于从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字

ORACLE 中rownum和row_number()的使用区别(可指定取sql结果集的第几个数据)

这篇文章主要介绍了oracle中rownum和row_number()的使用方法以及区别和联系,十分的详细,有需要的小伙伴可以参考下. row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的). 与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪劣rownum然后再进行排序,而row_number()在包含排序从句后

oracle 中 rownum 和 row_number()

简单的介绍下oracle 中rownum 和 row_number() 使用,实例演示. 参照:http://www.cnblogs.com/zjrstar/archive/2006/08/31/491090.html 我们先创建一个例子用以说明,偷个懒,就用上面那位童鞋的. create table student (ID char(6), name VARCHAR2(10)); insert into student values('200001','张一'); insert into st

ORACLE 中ROWNUM

ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=),并非说用>,& gt;=,=,between..and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好了这个 rownum 伪列的意义就不应该感到惊奇,同样是伪列,rownum 与 rowid 可有些不一样,下面以例子说明 假设某个表 t1

Oracle中rownum用法警示

今天调试代码,发现分页查询时使用Oracle中rownum的between......and用法的bug,特此总结: 参考资料:http://blog.csdn.net/lg312200538/article/details/4587455 对于Oracle的rownum问题,很多资料都说不支持>,>=,=,between……and,只能用以下符号(<.<=.!=),并非说用>,>=,=,between……and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会