請耐心看完,特別是這兒學的亂的 一點點看底面的代碼分析你一定會懂的 rownum:是偽號的意思,Oracle專有,不屬於任何表,但是任何表都可以使用! 作用:用以給查詢出來的所有元組加上行號 規則:1,預設是從1開始,依次遞增。 2,不能去點rownum 3,rownum寫在哪個select中,這個 ...
請耐心看完,特別是這兒學的亂的
一點點看底面的代碼分析你一定會懂的
rownum:是偽號的意思,Oracle專有,不屬於任何表,但是任何表都可以使用!
作用:用以給查詢出來的所有元組加上行號
規則:1,預設是從1開始,依次遞增。
2,不能去點rownum
3,rownum寫在哪個select中,這個select語句條件後就不能用rownum>某個數字,可以<某個數字,因為是預設是從1開始的,我們如果rownum>某個數字,條件就一下不滿足了,查詢結果就是空的,很抽象,我們來看一下 下麵的代碼。
這是根據scott用戶下的emp表做的一個練習
題目是:--查詢emp表中順序在6-10的員工信息
思路:首先,我們要查全部員工是不是這樣:
select * from emp;
然後我們給這些員工加序號
select rownum,emp.* from emp; --註意,*前面要加上表名去點它了
排好序後我們就可以挑選序號了,首先規則3裡面說的rownum在哪個select中,這個select條件後就不能使用大於號,所以我們先使用小於號,小於號可以使用,我們先選出1-10
select rownum,emp.* from emp where rownum<11;
然後我們怎麼給它加大於號呢?嵌套,剛纔說,rownum在哪個select中,這個select條件後就不能使用大於號,但不代表外部的select不能用,然後我們把上面select當成一個表嵌套在一個新的select中
select * from (select rownum r,emp.* from emp where rownum<11) e where e.r>5; --註意,rownum後我加了別名了,規則2裡面說的不能去點rownum,我們可以給它加別名去點它,e是給嵌套的表
取得別名,用來取出裡面的rownum
再來一個題目吧:
--查詢工資排名6-10人員的姓名 -->註意,這兒多了一個條件,多了工資要排序
第一步,我就羅嗦的寫下,查詢所有人員的姓名
select ename from emp;
第二步,我們用order by 以工資的降序來排名
select ename from emp order by sal desc;
第三步,重點來了,我們不能在上面的句子中加rownum,因為SQL語句的執行順序是:from--where--group by--having--select--rownum--order by
大家想想,根據SQL順序,我們在上面加了rownum排好了1,2,3,4,5,6行後,最後執行的order by一下就給打亂了對不對,我給大家演示一下錯誤的,
我先執行select rownum,ename from emp;再執行select rownum,ename from emp order by sal desc;大家看看差別:
是不是順序亂了,所以我們不能在select ename from emp order by sal desc;也就是第二步代碼上直接加rownum,我們這個時候還得還得用嵌套,該怎麼理解呢?第四步:上圖中看到,我們已經把工資從高到底排好,並且給排好後的工資加了序號,這個時候我們就可以挑選了
你不是order by最後執行嗎,那好我先讓你根據order by排序好工資從高到低,然後我給你的order by這個select 外面套一個select,這個select用來給排好工資
的表加上序號,大家看下代碼理解一下:
select rownum,e.ename from (select ename from emp order by sal desc) e;
select ename from(
select rownum r,e.ename from(select ename from emp order by sal desc) e where rownum<11
) e1 where e1.r>5;
以上代碼大家可以取PLSQL親自敲一下,助於理解。
規則總結的不准確的或有缺失的點,內容有錯誤的歡迎指正!
謝謝!
作者:人在風雨中
出處:https://www.cnblogs.com/xuqx/
歡迎轉載,轉載請標明出處。
如果你覺得本文還不錯,對你的學習帶來了些許幫助,請幫忙點擊右下角的推薦