oracle和sql server取第一条记录的区别以及rownum详解

转载 2013年12月04日 15:34:22

我们知道学生可能有重名的情况,那么当重名的时候假设只需要取得重名结果集中的第一条记录。

 

sql server:
select top(1) num,Name from M_Student where name = 'xy'

 

Oracle:
select num,Name from M_Student where name = 'xy' and rownum <= 1


对于rownum在oracle的使用的时候,有几点需要注意:

 

(1) rownum 对于等于某值的查询条件

如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。


(2) rownum对于大于某值的查询条件

如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录。

 

(3) rownum对于小于某值的查询条件

rownum对于rownum<n(n>1的自然数)的条件认为是成立的,所以可以找到记录。比如 rownum < 3


(4) rownum和排序

Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。

select rownum ,id,name from student order by name;
   
ROWNUM    ID          NAME
3                200003     李三
2                200002     王二
1                200001     张一
4                200004     赵四

可以看出rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。必须使用子查询。

 

select rownum ,id,name from (select * from student order by name);

ROWNUM    ID          NAME
3                200003     李三
2                200002     王二
1                200001     张一
4                200004     赵四

这样就成了按name排序,并且用rownum标出正确序号(由小到大)

 
看一个例子

把最先进入公司的5个人找出来

方法一 SELECT * FROM emp WHERE ROWNUM <= 5 ORDER BY hiredate;

方法二 SELECT * FROM(SELECT * FROM emp ORDER BY hiredate) WHERE ROWNUM <= 5;

 


把最先进入公司的6-10个人找出来

方法一
SELECT * FROM (SELECT * FROM emp ORDER BY hiredate) 
WHERE ROWNUM <= 10   
MINUS 
SELECT * FROM (SELECT * FROM emp ORDER BY hiredate) 
WHERE ROWNUM <= 5;

 

方法二(分页常用)
SELECT * FROM (SELECT e.*, ROWNUM rn FROM (SELECT * FROM emp) e WHERE ROWNUM <= 10) t WHERE t.rn >= 6;
 

SELECT * FROM (SELECT e.*, ROWNUM rn FROM (SELECT ename, sal FROM emp) e WHERE ROWNUM <= 10) WHERE rn >= 6;

 

参考博客:
http://topic.csdn.net/t/20040329/17/2900155.html
http://apps.hi.baidu.com/share/detail/5881277

oracle和sql server取第一条记录的区别以及rownum详解

我们知道学生可能有重名的情况,那么当重名的时候假设只需要取得重名结果集中的第一条记录。   sql server: select top(1) num,Name from M_Stude...
  • orichisonic
  • orichisonic
  • 2016年04月21日 14:40
  • 2684

SQL oracle 用rownum方法查询最近更新的n条数据

查询最近2小时跟新的记录 Select * From book Where update_time > sysdate-2/24 sysdate+(5/24/60/60) 在系统时间基础上延迟5秒...
  • yanjiaye520
  • yanjiaye520
  • 2014年05月07日 11:35
  • 8979

[oracle] rownum 及 选取排序后的前N条数据

 oracle sql rownum      在查询中,我们可以注意到,类似于“select xx from table where rownum 1)这样的查询是有正确含义的,...
  • lijianhe043
  • lijianhe043
  • 2014年12月30日 17:11
  • 10197

sql server 和oracle 中数据类型的区别

  • 2012年03月22日 14:00
  • 14KB
  • 下载

oracle与SQL server的主要区别

  • 2011年05月19日 15:41
  • 32KB
  • 下载

SQL Server和Oracle常用函数区别

  • 2010年10月13日 10:08
  • 36KB
  • 下载

oracle和sql server的区别

  • 2012年05月06日 14:50
  • 131KB
  • 下载

oracle和sql server区别

  • 2009年06月02日 16:22
  • 28KB
  • 下载

如何在SQL Server实现类似RowNum伪列

--如何在SQL Server实现类似RowNum伪列 --说明:Oracle中RowNum伪列一般按照表中数据的插入顺序排列,是查询时默认的数据输出排序方式 --建立测试样表 USE TSQL201...
  • ChristopherChen
  • ChristopherChen
  • 2016年08月15日 17:16
  • 6247

Oracle数据库与SQL Server数据库的区别

Oracle体系结构与SQL Server 有着本质的区别,不只是不同厂商类似的数据库产品。、 1.Oracle 数据库系统是一个跨平台的数据库管理系统,可以运行在Windows、UNIX、Linu...
  • yansong_8686
  • yansong_8686
  • 2013年05月19日 17:19
  • 1074
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:oracle和sql server取第一条记录的区别以及rownum详解
举报原因:
原因补充:

(最多只允许输入30个字)