由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是用ORDER BY跟ROWNUM和子查询的组合来实现SELECT TOP N的查询。
rownum:
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。
<wbr></wbr>
example: select rownum as 行号,first_name as 员工姓名 from hr.employees
select rownum as 行号,first_name as 员工姓名 from hr.employees
<wbr>order by 员工姓名;</wbr>
<wbr></wbr>
序号不会重新排的,(所以需要嵌套一层子查询来抽取排序好的数据)原因下面解释。
<wbr></wbr>
例1:查询各个部门的MANAGER(经理)中谁的工资最低<wbr><wbr><span></span>hr</wbr></wbr>
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;表示取第一行,<wbr><span style="font-family:宋体; color:#0c0c0c; line-height:21px; word-wrap:normal; word-break:normal"><strong style="font-weight:bold">rownum<=1也是;但</strong><span style="font-family:Arial; color:#000000; line-height:21px; word-wrap:normal; word-break:normal"><wbr></wbr></span><span style="font-family:宋体; color:#0c0c0c; line-height:21px; word-wrap:normal; word-break:normal"><strong style="font-weight:bold">rownum=2、>2、=2什么的是不行的</strong></span></span></wbr>
只能用<=、<、=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
*******************************************************************************
<wbr></wbr>
但是如果想要提取出第m行的数据或者中间几条数据该怎么办?rownum=m是不行的
这里可以再用嵌套的子查询
例3:查询工资从高到低排名第2-5个人的信息<wbr><wbr>hr.</wbr></wbr>
<wbr></wbr>select
部门名称,员工姓名,工资 from<wbr><wbr></wbr></wbr>--第一层
<wbr><span></span>(<br><wbr><wbr><wbr><wbr><span></span>select rownum as no,部门名称,员工姓名,工资 from<wbr><span></span>--第二层,这里的rownum得有别名,不然外层和其本身的重名<br><wbr><wbr><wbr><wbr><span></span>(<br><wbr><wbr><wbr><span></span><wbr>select t2.department_name as 部门名称,</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>--
第三层
<wbr><wbr><wbr><wbr><span></span>t1.first_name as 员工姓名,t1.salary as 工资<br><wbr><wbr><wbr><span></span><wbr>from employees t1<br><wbr><wbr><span></span><wbr><span></span>left outer join departments t2 on t2.department_id=t1.department_id<br><wbr><wbr><span></span><wbr><span></span>order by t1.salary desc<br><wbr><span></span><wbr><wbr><span></span>)<br><wbr><span></span>where rownum<=5</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>--取出前五行
<wbr><span></span>)<br>
where no>=2 and no<=5<span></span><span style="color:#ff0000; line-height:21px; word-wrap:normal; word-break:normal">-- 取出2-5编号</span></wbr>
<wbr></wbr>
<wbr></wbr>
例4:抽出按某种方式排序的记录集中的第M条记录开始的X条记录
和上面的差不多,第三层rownum<=N<wbr><wbr><span></span>这里的N必须满足N >= (M + X - 1)</wbr></wbr>
最外的条件改为
no bwtween M and (m+x-1)就可以了
分享到:
相关推荐
如何在Oracle中实现SELECT_TOP_N的方法
在ORACLE中实现SELECT TOP N的方法,所讲的都是一些最基本的,实际应用中往往都没有这么简单,但是不管怎么说,不管复杂的应用总是由这些简单的元素构成,掌握一些最基本的方法始终是重要的。
本文通过举例的方式来教你如何在Oracle中实现SELECT TOP N的方法。
1.在Oracle中实现SELECT TOP N 由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是用ORDER BY跟ROWNUM的组合来实现SELECT TOP N的查询。 简单地说,实现方法如下所示: SELECT 列名1...列名n FROM ...
Oracle中的select into Oracle中没有select into的用法! 在某些数据库中有select into的用法,用法是: select valueA,valueB into tableB from tableA; 上面这句语句的意思是将tableA表中的valueA和valueB字段的值...
Oracle SQL语法不支持select top 100 * from table_a之类的top语法,当然可以使用rownum取出多少行来看,但是如果加上排序还使用这个rownum的话,大部分情况是,先取出rownum行记录,然后排序再显示,这和我们要求的...
sql语句中select top n与oracle的rownum与mysql的limit 取前几条数据sql简单用法
GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY分组取前N条记录实现方法。 这是测试表(也不知道怎么想的,当时表名直接敲了个aa,汗~~~~): 结果: 方法一: 代码如下:SELECT a.id,a.SName,a.ClsNo...
ORACLE INSERT INTO SELECT *FROM 分批提交例子
oracle数据库中的top n问题,上述文件结合数据库分页说明了oracle中的top n问题
Oracle左连接返回多条记录中一条记录的查询语句,更具指定条件分组排序,返回各组中第一条记录
A、获取top前10个Oracle的进程,并打印出(根据实际进程情况列出 R/S 状态) B、对这些进行进行PS检查资源占有情况,并确定是那个数据库实例的进程 C、根据当前目录下的connect.json配置数据库连接数据库访问,打印...
本文档详细介绍了如何在Oracle数据库中实现像C#等其它编程语言中Split函数来拆分字符的功能。例子简单易懂,并附有详细的实现过程。
select语句用法大全,Oracle的查询语句是比较常用的。
首先在oracle中没有datediff()函数 可以用这个方法在oracle中实现该函数的功能。
主要介绍了Oracle结合Mybatis实现取表TOP 10条数据的相关资料,需要的朋友可以参考下
查询及删除重复记录的SQL语句1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断select * from 表 where Id in (select Id from 表 group by Id having count(Id) > 1)2、删除表中多余的重复记录,...
oracle-select
这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit却强制关闭连接,oracle就会将这条提交的记录锁住。由于我的java程序...