rownum是对查询的结果集加上的一个伪列,先查询出来有一个结果集,然后再在这个结果集上加一个伪列,也就是说先有查询结果集,再有rownum,它不属于数据库的列,而且它的值总是从1开始排起的,或者说它是对查询符合条件的结果集的序列号,所以它总是先有1,再有2,等等。
所以你不可能查询出rownum是从2开始的,这样:
rownum | c1 |
2 | value1 |
3 | value2 |
查询不可能查出这样的结果集,不管怎样,rownum首先是从1开始计数起的。
rownum是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如 果你用>,>=,=,between……and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下 条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。
那oracle数据库读取数据的顺序是怎样的呢,是根据你插入数据库的顺序来排的,比如先插入value1,再插入value2,...,再查询出的结果集,顺序是这样的:value1,value2...
一般分页都是这样写的:
select * from
(select rownum as rn, d.* from dept d) d1
where rn >= 1 and rn <= 3
这样有点问题,因为先全部查询符合条件的结果集d1的行数可能是很多的,可能你分页的每一页只需要一部分,那大于你行数的数据就没必须查出来了,下面请看。
这样再高效:
select * from
(select rownum as rn, d.* from dept d where rownum <=3 ) d1
where rn >=1
先查出行数<=3的结果集d1,再从子查询结果集d1中帅选出行数>=1的结果集。这样就避免了全部查出符合条件数据过多。