淘先锋技术网

首页 1 2 3 4 5 6 7
< p >每一个从事 SQL 开发工作的人都会遇到一些特殊的需求,比如我们只需要查询前几条数据或者只查询一部分数据就能获得我们需要的结果,那么这个时候就可以用到 Oracle 中非常重要的一个函数 ROWNUM。< p >ROWNUM 是 Oracle 中一个伪列(Pseudo Column),这个伪列向我们展示了数据返回的行数编号。简单的说,当我们查询数据时,Oracle 会在数据返回前每行加入一个行号,但这个行号并不是数据表格中真实的行数,而是经过 Oracle 处理后的返回的数据行号。ROWNUM 只是在数据返回前返回的行号,并且是 Oracle 会自动加上去的。如果在 SQL 语句中没有明确的排序语句,那么 ROWNUM 将会根据数据返回的顺序来返回编号。< pre >SELECT * FROM (SELECT ROWNUM rn, t.* FROM tab_name t WHERE RowNum<= 20) WHERE rn >10;< /pre >< p >在这个例子中,我们查询了一个表格中的前 20 行数据,数据会在外层的 SELECT 返回。但是,由于 ROWNUM 只是在内层的 SELECT 命令中使用过一次数据得到了编号,这个数字是 Oracle 判断出的独立行的数量。而在查询返回的结果中,ROWNUM 的行号是可能缺失或者有重复的。< p >想要使用 ROWNUM 进行筛选,需要注意的就是那个筛选条件一定要放在内层的 SELECT 中,否则的话你将会获得你不想要的结果。因为如果你使用 ROWNUM+1,2,3……等筛选条件,结果将会始终为 0,需要放在内层的 SELECT 包含的原因大概是因为内层的 SELECT 中结果已经排好序了,再把排序的结果保存在外层的 SELECT 中。< pre >SELECT * FROM (SELECT t.* FROM tab_name t WHERE ROWNUM<= 20) WHERE rownum >5;< /pre >< p >有时候我们需要按自己的视角进行编号,例如我们希望在数据表格中实现自增 ID 的效果,那么可以通过用户定义一个变量来实现。在比如在 WHERE 或者 ORDER BY 语句中,我们都可以通过 ROW_NUM 变量来替代 ROWNUM 伪列。请看代码语句。< pre >SELECT a.*, ROW_NUMBER () OVER (ORDER BY a.column_name ASC) ROWNUMBER FROM your_table_name a< /pre >< p >另外需要注意的是 ROWNUM 函数并不是支持在分组操作中使用的,通常 GROUP BY 语句和 ROWNUM 是无法组合使用的,如果想要使用的话,需要将这个分组数据放在所有的查询结果返回之后才可以。< p >总的来说,ROWNUM 是一个非常充实的函数,我们可以在排序、分页、使用伪分区等处理中使用它,可以使 SQL 语句变得更加高效有力。