这周三周四 oracle考试 .早上看了下考试答案,有一地不明:
取出SC表中最高分的学生学号和课程号(5分)
答案: Select no ,cno from sc where rownum=1 order bydegree desc ;
或者 select no,cno from sc where degree = (selectmax(degree) from sc);
![](http://hi.csdn.net/attachment/201201/13/0_1326416814ZQ1D.gif)
正确结果应该是 学号为103 课程号为3-105的数据.
so 第一种情况的思想是 按降序对成绩排列,然后查询如下
我理解为,rownum是在做新增行的时候就记录好每个行的顺序了.并且,它的顺序是按照RowId 的大小对应的。
如图中,第二行的 RowId 这个物理ID是最小值,那么对应的RowNum也就是最低的.
so 我觉得Select no ,cno from sc where rownum=1 order bydegree desc ;这样的语句不能满足查出最大值
因为,rownum=1则找到第一次插入此表的数据
做一个实验,删掉NO为105的行,即RowNum =2 RowId = AAAOSaABBAAAABkAAB这行的数据
再重新插入来查看 新的 RowId和 RowNum
如上图分析得出,rownum确实是和rowid对应,小的rowid对应小的rownum
则考试答案第一种结果是不正确的
应该改成
select * from (Select no ,cno from sc order bydegree desc ) where rownum=1; 其中红色部分其实是一张伪表
如图分析:
此时的rownum并不对应最小的RowId ,那不是自相矛盾吗?
再分析了下:从伪表中查出的数据默认是排序的,Rownum则有新的顺序
rowid只是物理行号地址而已
所以rownum一般建议是在查询中进行使用