如何在Oracle中实现SELECT TOP N,选取前几条记录
2012-08-27 20:29
316 查看
由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是用ORDER BY跟ROWNUM和子查询的组合来实现SELECT TOP N的查询。
rownum:
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。
example: select rownum as 行号,first_name as 员工姓名 from hr.employees
select rownum as 行号,first_name as 员工姓名 from hr.employees
order by 员工姓名;
序号不会重新排的,(所以需要嵌套一层子查询来抽取排序好的数据)原因下面解释。
例1:查询各个部门的MANAGER(经理)中谁的工资最低 hr
select * from
(
select t1.manager_id as 员工编号,t2.first_name as 员工姓名,t2.salary as 工资
from hr.departments t1
join hr.employees t2 on t1.manager_id=t2.employee_id
order by t2.salary
)
where rownum=1;
*******************************************************************************
where rownum=1;表示取第一行, rownum<=1也是;但 rownum=2、>2、=2什么的是不行的
只能用<=、<、=1,而且排序好后得用一个子查询
原因:
1.因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。
查到就加上了,所以排序就是原先的rownum值了。
2.rownum j就是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值。
3.他是不存在的,只有在每次select后才会重新分配,所以加个子查询重新分配rownum
*******************************************************************************
例2:查询工资最高的5个人的信息,按工资降序排列:hr
select * from
(
select t2.department_name as 部门名称,
t1.first_name as 员工姓名,t1.salary as 工资
from employees t1
left outer join departments t2 on t2.department_id=t1.department_id
order by t1.salary desc
)
where rownum<=5
*******************************************************************************
但是如果想要提取出第m行的数据或者中间几条数据该怎么办?rownum=m是不行的
这里可以再用嵌套的子查询
例3:查询工资从高到低排名第2-5个人的信息 hr.
select
部门名称,员工姓名,工资 from --第一层
(
select rownum as no,部门名称,员工姓名,工资 from --第二层,这里的rownum得有别名,不然外层和其本身的重名
(
select t2.department_name as 部门名称, --
第三层
t1.first_name as 员工姓名,t1.salary as 工资
from employees t1
left outer join departments t2 on t2.department_id=t1.department_id
order by t1.salary desc
)
where rownum<=5 --取出前五行
)
where no>=2 and no<=5 -- 取出2-5编号
例4:抽出按某种方式排序的记录集中的第M条记录开始的X条记录
和上面的差不多,第三层rownum<=N 这里的N必须满足N >= (M + X - 1)
最外的条件改为
no bwtween M and (m+x-1)就可以了
rownum:
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。
example: select rownum as 行号,first_name as 员工姓名 from hr.employees
select rownum as 行号,first_name as 员工姓名 from hr.employees
order by 员工姓名;
序号不会重新排的,(所以需要嵌套一层子查询来抽取排序好的数据)原因下面解释。
例1:查询各个部门的MANAGER(经理)中谁的工资最低 hr
select * from
(
select t1.manager_id as 员工编号,t2.first_name as 员工姓名,t2.salary as 工资
from hr.departments t1
join hr.employees t2 on t1.manager_id=t2.employee_id
order by t2.salary
)
where rownum=1;
*******************************************************************************
where rownum=1;表示取第一行, rownum<=1也是;但 rownum=2、>2、=2什么的是不行的
只能用<=、<、=1,而且排序好后得用一个子查询
原因:
1.因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。
查到就加上了,所以排序就是原先的rownum值了。
2.rownum j就是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值。
3.他是不存在的,只有在每次select后才会重新分配,所以加个子查询重新分配rownum
*******************************************************************************
例2:查询工资最高的5个人的信息,按工资降序排列:hr
select * from
(
select t2.department_name as 部门名称,
t1.first_name as 员工姓名,t1.salary as 工资
from employees t1
left outer join departments t2 on t2.department_id=t1.department_id
order by t1.salary desc
)
where rownum<=5
*******************************************************************************
但是如果想要提取出第m行的数据或者中间几条数据该怎么办?rownum=m是不行的
这里可以再用嵌套的子查询
例3:查询工资从高到低排名第2-5个人的信息 hr.
select
部门名称,员工姓名,工资 from --第一层
(
select rownum as no,部门名称,员工姓名,工资 from --第二层,这里的rownum得有别名,不然外层和其本身的重名
(
select t2.department_name as 部门名称, --
第三层
t1.first_name as 员工姓名,t1.salary as 工资
from employees t1
left outer join departments t2 on t2.department_id=t1.department_id
order by t1.salary desc
)
where rownum<=5 --取出前五行
)
where no>=2 and no<=5 -- 取出2-5编号
例4:抽出按某种方式排序的记录集中的第M条记录开始的X条记录
和上面的差不多,第三层rownum<=N 这里的N必须满足N >= (M + X - 1)
最外的条件改为
no bwtween M and (m+x-1)就可以了
相关文章推荐
- 如何在Oracle中实现SELECT TOP N,选取前几条记录
- 在Oracle中实现SELECT TOP N,选取前几条记录
- 取Oracle中实现TOP N,选取前几条记录
- 本文通过举例的方式来教你如何在Oracle中实现SELECT TOP N的方法(转)
- 本文通过举例的方式来教你如何在Oracle中实现SELECT TOP N的方法(转)
- 如何在Oracle中实现SELECT TOP N的方法
- 如何用SQL实现从第几条记录开始取几条
- MySQL中如何实现select top n ----Limit
- 在ORACLE中实现SELECT TOP N的方法
- 在ORACLE中实现SELECT TOP N的方法
- 在ORACLE中SELECT TOP N的实现方法
- 在ORACLE中实现SELECT TOP N的方法
- MySQL中如何实现select top n
- 在ORACLE中实现SELECT TOP N的方法
- 如何解决ACCESS中SELECT TOP语句竟然返回多条记录的问题?
- 在ORACLE中实现SELECT TOP N的方法
- 如何解决ACCESS中select TOP语句竟然返回多条记录的问题?
- access中Top与Order by 的问题——如何解决 SELECT TOP 1语句竟然返回多条记录的问题?
- 在ORACLE中实现SELECT TOP N的方法
- MySQL中如何实现select top n