[ 概要 ]
剛剛接觸oracle的同學可能經常會被rowid和rownum這兩個詞弄混, 弄清楚這兩個家伙對于我們寫sql會有非常大的幫助, 以下偶就拋磚引玉, 簡單地談談他們之間的差別吧.
[ 比較 ]
rowid和rownum都是oracle中的偽列, 但他們還是存在本質差別:
rowid: 是物理地址, 用于定位數據表中數據的位置, 它是唯一的且不會改變.
rownum: 是依據查詢的結果集給每行分配的一個邏輯編號, 查詢結果不同, rownum自然不同.?
對于同一條記錄, 查詢條件不同, rownum會不同, 可是rowid將不變.
演示樣例: 查詢公司全部的員工
select rowid, rownum, empno, ename from emp;
演示樣例: 查詢公司員工姓名包括'S'
select rowid, rownum, empno, ename from emp where ename like '%S%';
細心的同學不難發現, 對于一行記錄, rowid沒變, rownum變了. 比如: 姓名為'SMITH'的員工.
[ 陷阱 ]
1. rownum僅僅支持符 號 <、<=、!=, 不支持 >, >=, =, between...and
select * from emp where rownum > 10 -- 沒有結果
select * from (select rownum row_num, e.* from emp e) emp_temp where emp_temp.row_num > 10; -- 能夠獲取十位以后記錄
解釋一下: 由于rownum是對結果集加的一個偽列, 即先查到結果集之后再加上去的一個列(強調: 要有結果集). 簡單地說rownum是符合條件結果的序列號, 它總是從1開始排位, 所以你選出的結果不可能沒有1, 而有大于1的值.
有了上面的知識, 我們就不難解釋下面現象:
① 為什么select * from emp where rownum != 10 總是返回前9條記錄?
由于查詢到結果集后, 顯示完第9條記錄, 之后的記錄都是 != 10.
② 為什么rownum > 1 查不到一條記錄, 而rownum > 0 或 rownum >= 1 卻總顯示全部記錄?
由于rownum是在查詢到結果集之后加上去的, 它總是從1開始.
③ 為什么between 1 and 10 或者 between 0 and 10 能查到結果, 而between 2 and 10卻得不到結果?
原因同上, 少了rownum=1就像空中樓閣一樣不能存在.
[ 應用 ]
廢話扯了一籮筐, 這兩哥們究竟有啥用呢?
嘿嘿, 別急, 以下就上正菜...
問題: 獲取薪水排名前三的員工
分析: 假設是sql server就好了, 我們能夠使用topkeyword, oracle中我們用rownum也能解決
select * from (select * from emp order by sal desc) where rownum <= 3 order by rownum asc
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
