(今天仔细查看了下 oracle rownum 的文档,整理了一下,当做笔记;)
[b]ROWNUM Pseudocolumn[/b]
在查询结果中,ROWNUM 用于唯一标识查询结果记录,
------
[b]rownum 的赋值[/b]
rownum 的赋值时间点在 记录查处之后,且在排序之前,
查询结果中每条记录的 ROWNUM 是唯一的,在记录查出后,rownum值 第条记录是 1,第2条是 2,依次类推,
如果查询语句使用了 order by 语句,那么 rownum 在赋值后,记录再按照 order by 语句排序,则最后查出的结果的顺序 跟 rownum 的排序 可能是不一致的,
在带有 order by 语句的查询中,如果希望最后查出记录的顺序 和 rownum 一致,则需要先排序查询,再从查询结果进行查询,即多了一层查询;
------
[b]rownum 的使用[/b]
可以根据 rownum 限制查询记录数 或 分页,需要遵循 rownum 的规则,
rownum 的比较规则:
* <
小于比较,按大小比较,等同于小学算术比较;
* =
等于比较,只能和 1 进行等于比较,大于1的任何行都返回 false,
因此只能使用 rownum = 1,对于 rownum = 2 是不返回任何记录的;
* >
大于比较,只能大于 0 ,也就等同于没有限制,
当和大于0的值进行比较时,都返回 false,不会查处任何记录;
* <=
小于等于,相当于 < 和 = 的并集,等同于小学算术比较;
* >=
大于等于,相当于 > 和 = 的并集,只能和 0,1 比较,即 >=0 或 >=1,相当于没有限制,这个是没有意义的;
------
[b]> 和 = 比较操作:[/b]
如果希望像算数运算一样使用 > 和 = ,则需要先在查询中将 rownum 查出来,组成新的记录集,在新的记录集中存的 rownum 就变成了可以进行各种算数比较的数值,
再用1个外层查询从这个记录集中进行查询,这样外层查询就可以使用内层查出的 rownum 值进行各种比较了;
------
[b]分页[/b]
分页查询总需要对 rownum 进行 > 和 < 比较操作,但是 rownum 本身的 > 比较 不支持大于1的比较,
因此需要先将 rownum 查出来,然后再外层查询对已查出的 rownum 值进行各种算数比较;
------
[b]例子:[/b]
查询 abc 表的所有字段,每页10条,分别查: “不排序第1页”,“排序第1页”,“不排序第2页”,“排序第2页”
------
[b]ROWNUM Pseudocolumn[/b]
在查询结果中,ROWNUM 用于唯一标识查询结果记录,
------
[b]rownum 的赋值[/b]
rownum 的赋值时间点在 记录查处之后,且在排序之前,
查询结果中每条记录的 ROWNUM 是唯一的,在记录查出后,rownum值 第条记录是 1,第2条是 2,依次类推,
如果查询语句使用了 order by 语句,那么 rownum 在赋值后,记录再按照 order by 语句排序,则最后查出的结果的顺序 跟 rownum 的排序 可能是不一致的,
在带有 order by 语句的查询中,如果希望最后查出记录的顺序 和 rownum 一致,则需要先排序查询,再从查询结果进行查询,即多了一层查询;
------
[b]rownum 的使用[/b]
可以根据 rownum 限制查询记录数 或 分页,需要遵循 rownum 的规则,
rownum 的比较规则:
* <
小于比较,按大小比较,等同于小学算术比较;
* =
等于比较,只能和 1 进行等于比较,大于1的任何行都返回 false,
因此只能使用 rownum = 1,对于 rownum = 2 是不返回任何记录的;
* >
大于比较,只能大于 0 ,也就等同于没有限制,
当和大于0的值进行比较时,都返回 false,不会查处任何记录;
* <=
小于等于,相当于 < 和 = 的并集,等同于小学算术比较;
* >=
大于等于,相当于 > 和 = 的并集,只能和 0,1 比较,即 >=0 或 >=1,相当于没有限制,这个是没有意义的;
------
[b]> 和 = 比较操作:[/b]
如果希望像算数运算一样使用 > 和 = ,则需要先在查询中将 rownum 查出来,组成新的记录集,在新的记录集中存的 rownum 就变成了可以进行各种算数比较的数值,
再用1个外层查询从这个记录集中进行查询,这样外层查询就可以使用内层查出的 rownum 值进行各种比较了;
------
[b]分页[/b]
分页查询总需要对 rownum 进行 > 和 < 比较操作,但是 rownum 本身的 > 比较 不支持大于1的比较,
因此需要先将 rownum 查出来,然后再外层查询对已查出的 rownum 值进行各种算数比较;
------
[b]例子:[/b]
查询 abc 表的所有字段,每页10条,分别查: “不排序第1页”,“排序第1页”,“不排序第2页”,“排序第2页”
-- 不排序,前10条
select * from abc where rownum <=10;
-- 排序,前10条
select * from
(select * from abc order by id desc) abc_order
where rownum <=10;
-- 不排序,11 - 20 条
select * from
(select abc.*, rownum as row_num from abc where rownum <=20) abc_order
where row_num >= 11;
-- 排序,11 - 20 条
select * from
(
select abc_order.*, rownum as row_num
from
(select * from abc order by id desc) abc_order
where rownum <= 20
)
where row_num >=11;
------