oracle和sql server取第一条记录的区别以及rownum详解
2016-04-21 14:40
441 查看
我们知道学生可能有重名的情况,那么当重名的时候假设只需要取得重名结果集中的第一条记录。
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
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设置sys用户以普通用户身份登录数据库
- Windows下oracle打补丁步骤
- Oracle学习笔记(三十一)——oracle视图
- 数据库 --> SQL Server 和 Oracle 以及 MySQL 区别
- Oracle学习笔记(三十)——pl/sql的进阶之例外处理
- Oracle学习笔记(二十九)——pl/sql的进阶之编写分页过程
- Oracle学习笔记(二十八)——pl/sql的进阶之控制结构
- oracle安装好后 创建用户
- oracle数据库插入二进制文件
- oracle11g各版本下载地址
- Oracle使用dbfsize查看控制文件、数据文件、日志文件的block size
- ORACLE SUM over分析函数
- oracle的分析函数over 及开窗函数
- ORACLE数据库事务隔离
- oracle dmp 导出缺表问题
- mysql和oracle分页实现方式
- 修改oracle用户密码永不过期
- 打印所有的Oracle HotSpot JVM参数及其默认值(HotSpot JVM Options/Flags)
- Oracle数据库的日常使用命令
- oracle mysql sqlserver 查看当前所有数据库及数据库基本操作命令