天天看点

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

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

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);

这样就成了按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

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;

参考博客:

<a href="http://topic.csdn.net/t/20040329/17/2900155.html">http://topic.csdn.net/t/20040329/17/2900155.html</a>

<a href="http://apps.hi.baidu.com/share/detail/5881277">http://apps.hi.baidu.com/share/detail/5881277</a>