rownum 表示行號,實際上此是一個列,但是這個列是一個偽列,此列可以在每張表中出現。
rowid 表示每一列對應的十六進制物理地址值
select e.*,rownum rn,rowid ri from emp e;
sq查詢語句運行順序
1.找到員工表中工資最高的三名員工,看第一段代碼
select * from (select ename,job,sal,rownum rn from emp order by sal desc) e where e.rn<4;
會發現我們排序后取出來的結果並不是工資最高的員工
2.分頁顯示數據,每頁5條數據,查第二頁數據
select e.*,rownum from emp e where rownum<=10 and rownum>5; 會報錯
根據sql語句的運行順序,我們就很好解釋這兩個問題出現的原因了,第一個語句子查詢語句先運行select后運行order by,所以行號是按開始的順序排列的.
第二個語句先運行where條件,rownum是從1開始所以,>5永遠為假
關於第一個問題最簡單寫法
select * from (select * from emp order by sal desc) where rownum<4; rownum是偽列在每張表中出現,所以可以直接使用;
第二個問題寫法
select * from (select e.*, rownum rn from emp e) p where p.rn<=10 and p.rn>5;
3.對比一些代碼,更多的了解一下rownum
select rownum from emp; 不報錯
select e.rownum from emp e; 報錯
emp表中沒有rownum這一列,rownum只是一個偽列,每一張表中都有,但又不實際存在,所以可以直接查詢,而不可以用表點查詢
select e.*,rownum from emp e; 不報錯
select *,rownum from emp; 報錯
這個疑問是一個美女給我解答的,她說*已經代表所有,后面不能再加字段,會出現語法錯誤,表點星是代表這個表的所有列,后面可以再跟其他的字段
select * from (select ename,job,sal,rownum from emp order by sal desc) where rownum<5; 可以先猜想一下這個運行結果是什么
select * from (select ename,job,sal ,rownum from emp) p where p.rownum<5; 先猜想一下這個運行會不會報錯.
上面兩個問題第一個你會發現取出來的結果是工資最高的前四名員工,可以考慮一下原因,判斷條件的rownum是屬於哪張表的rownum.
第二個問題會報錯,報錯原因是字段重復或者說不知道去查詢哪個字段,p.rownum在一些人認為中是p表的rownum列,但其實p表還有一個偽列rownum.所以會造成沖突,解決辦法就是用別名.