(Oracle)SQL语句中的rownum和row_number()

with 0 comment

在Oracle数据库的执行SQL中,通常实现分页会使用rownum伪列进行处理,如果我们想进行分组并且排序时就可以使用row_number()函数来实现了

rownum和row_number()

rownum和row_number()是两个概念
rownum和row_number()差异之处来自于对排序的优先级
rownum是一个字段(伪列),先对查询结果集加入伪列然后在执行排序
row_number()是一个函数,函数后面包含排序从句,先排序再计算序号

rownum用法

直接将rownum关键字作为一个字段放在SQL中使用

select rownum,name from mebugs_user;

查询结果示例如下:

ROWNUM  NAME
------  ----
1       小王
2       小明
3       小红

rownum特质

rownum可以使用rownum=1来获取第一条记录
rownum无法使用rownum=n来获取第n条记录(当n>1时)

select rownum,name from mebugs_user where rownum = 1;

rownum无法使用rownum>n来获取第n之后的记录
如果想达成效果需要通过嵌套查询并且要将rownum指定别名来区分是主查询还是子查询
应用中比较常见的分页就是用的这种方式

select * from 
    (select rownum rol,name from mebugs_user) t 
where t.rol > 2;

rownum可以使用rownum<n来获取第1-n之间的记录

select rownum,name from mebugs_user where rownum < 5;

rownum+排序

rownum是先生成序号再进行排序的

select rownum,name from mebugs_user order by name;

上述语句的查询结果实例:

ROWNUM  NAME
------  ----
2       小明
1       小王
3       小红

如果想达到通过rownum先排序后赋予序号需要通过嵌套的方式完成

select rownum,t.name from 
    (select * from mebugs_user order by name) t;

row_number()语法

row_number()函数有两种写法,分别是排序和分组排序

根据id(用户ID)排序后再进行编号

select name,row_number() over (order by id) as rol from mebugs_user;

根据dept(部门)分组后再根据id(用户ID)排序后再进行编号

select name,row_number() over (partition by dept order by id) as rol from mebugs_user;

使用row_number() over (...)函数时,over开窗函数内的条件晚于外部的where、group by、order by

Comments are closed.