关于oracle的rownum
- oracle的rownum是个虚列,标示查询结果的显示顺序。如以下语句的查询结果的第一行rownum=1,第二行rownum=2,以此类推。
SELECT * , ROWNUM FROM employees WHERE ROWNUM < 10;
查询时,我们可以使用rownum来限制查询结果的数量,如上面的语句查询最多9个符合条件的雇员。
- rownum跟order by子句结合使用
查询结果的rownum不一定按顺序显示,这很大程度上跟执行查询语句时oracle访问数据的方式有关,比如官方文档举的例子,order by子句可能会导致oracle使用索引去访问数据,那么这种方式查询并显示的rownum,跟没有使用索引去访问并显示的rownum可能有所不同:
If an ORDER BY clause follows ROWNUM in the same query, then the rows will be reordered by the ORDER BY clause. The results can vary depending on the way the rows are accessed. For example, if the ORDER BY clause causes Oracle to use an index to access the data, then Oracle may retrieve the rows in a different order than without the index
比如下面的语句查询,rownum的显示跟上面语句查询所得不一定相同:
SELECT *,ROWNUM FROM employees WHERE ROWNUM < 11 ORDER BY last_name;
如果要rownum顺序显示,则要用到子查询,先在子查询后使用order by子句排序查询结果,然后在最外层使用rownum:
SELECT * FROM
(SELECT * FROM employees ORDER BY employee_id)
WHERE ROWNUM < 11;
- 查询条件rownum大于任何正数,则此查询条件永远是FALSE,即查询得到的结果集将是空。原因是在查询的结果集中,oracle将取得的第一行rownum设置为1,因为不符合查询条件,则被丢弃,oracle去抓取第二行,且其rownum仍为1,同样因为不符合条件被丢弃,接着去抓取第三行,将rownum设置为1,继续丢弃,如此类推,因此以下语句会返回空集:
SELECT * FROM employees
WHERE ROWNUM > 1;
- 我们可以使用以下语句将rownum设置为同样的值
UPDATE my_table
SET column1 = ROWNUM;
参考资料:
官方文档:ROWNUM Pseudocolumn