一、Oracle 12C之前的TOP-N与分页查询
在Oracle 12C之前的查询中,如果要返回查询结果中前N条记录,或对查询结果进行分页显示,需要使用伪列rownum,对查询结果集进行排序。
例如:查询工资排序在6-10名的员工号、员工名、工资及工资排序号
select * from
(select rownum num,employee_id,first_name,last_name,salary from
(select employee_id,first_name,last_name,salary from employee order by salaryy desc) nested_order1
) nested_order2
where num between 6 and 10;
二、在Oracle12C之后
在oracle12C中引入了row_limiting_clause
短语,可以方便的返回结果集中需要的记录。
offset : 指定跳过结果集的记录数,即从结果集的第offset+1个记录开始返回
row / rows : 使语句的语义更清晰,构成语法的完整性。两者没区别
fetch : 指定返回记录的数量 或 占整个结果集的百分比。如果没有指定改短语,则返回offset+1个记录开始的所有记录
frist / next : 使语句的语义更清晰,构成语法的完整性,两者没有区别
rowcount : 指定返回记录的数量
precent : 指定返回记录的数量占整个结果集的百分比
only : 表示实际返回的记录严格遵守指定返回的数量或百分比
with ties : 表示返回附加记录,这些附加记录与最后返回记录具有相同的排序字段值,此时select语句中必须具有order by 子句,否则不会返回附加记录
1.查询排在前5名的员工号,员工名,工资
select employee_id,first_name,last_name,salary
from employee
order by salary desc
fetch first 5 rows whith ties;
2.查询工资排在6-10名的员工号,员工名,工资
select employee_id,first_name,last_name,salary
from employee
order by salary desc
offset 5 rows fetch first 5 rows with ties;
3.查询5%的员工的员工号,员工名,员工工资
select employee_id,first_name,last_name,salary
from employee
order by salary desc
fetch first 5 precent rows with ties;
注:with ties的作用
比如现在有一些数据.
col
1
3
3
2
如果此时,我要取 ...order by col fetch first 3 rows
那结果就是1 2 3 只取一个3
如果加上with ties时,
则两个3都能取出来。