rownum 表示行號,實際上此是一個列,可是這個列是一個僞列,此列能夠在每張表中出現。sql
rowid 表示每一列對應的十六進制物理地址值spa
select e.*,rownum rn,rowid ri from emp e;blog
sq查詢語句運行順序排序
1.找到員工表中工資最高的三名員工,看第一段代碼select
select * from (select ename,job,sal,rownum rn from emp order by sal desc) e where e.rn<4; sql語句
會發現咱們排序後取出來的結果並非工資最高的員工分頁
2.分頁顯示數據,每頁5條數據,查第二頁數據語法
select e.*,rownum from emp e where rownum<=10 and rownum>5; 會報錯im
根據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.因此會形成衝突,解決辦法就是用別名.