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);
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;
參考博客:
https://topic.csdn.net/t/20040329/17/2900155.html
https://apps.hi.baidu.com/share/detail/5881277
最後更新:2017-04-03 05:40:23