Sql奇技淫巧之ROWNUM偽列的使用
ROWNUM偽列
ROWNUM
是一個偽列,它是根據(jù)每次查詢的結(jié)果動態(tài)生成的一列遞增編號,表示 Oracle 從表中選擇該行的順序,選擇的第一行ROWNUM
為1,第二行ROWNUM
為2,以此類推。
注意1:
ROWNUM
偽列是在WHERE
子句之前生成的,就是說它并不是在執(zhí)行了WHERE
子句過濾之后再對數(shù)據(jù)編號
比如在執(zhí)行WHERE
子句,結(jié)果數(shù)據(jù)是這樣的:
id | name | age | ROWNUM |
---|---|---|---|
0001 | mary | 18 | 1 |
0002 | mike | 20 | 2 |
0003 | john | 19 | 3 |
0004 | kitty | 16 | 4 |
0005 | susy | 18 | 5 |
0006 | echoo | 21 | 6 |
這時(shí)候的ROWNUM
是一列遞增排列的、完整的編號
然后如果執(zhí)行一個WHERE
子句:WHERE age >18
那數(shù)據(jù)就變成了:
id | name | age | ROWNUM |
---|---|---|---|
0002 | mike | 20 | 2 |
0003 | john | 19 | 3 |
0004 | kitty | 21 | 6 |
ROWNUM
出現(xiàn)了斷層,不連續(xù)了
如果后面再執(zhí)行一個ORDER BY age DESC
就變成這樣了:
id | name | age | ROWNUM |
---|---|---|---|
0004 | kitty | 21 | 6 |
0002 | mike | 20 | 2 |
0003 | john | 19 | 3 |
ROWNUM
不按順序排了
所以在利用ROWNUM
偽列來對結(jié)果集做限制、過濾、排序、分頁等操作的時(shí)候一定要注意這個點(diǎn),不然很容易錯亂;
注意2:
ROWNUM
是一行一行賦值的,只有上一行數(shù)據(jù)被選擇成功,下一行才會遞增!而且 select 語句也是一行一行選擇的,每 select 一行數(shù)據(jù)就要進(jìn)行 where 條件判斷。
比如有這樣一個employees表:
id | name | age |
---|---|---|
0001 | mary | 18 |
0002 | mike | 20 |
0003 | john | 19 |
0004 | kitty | 16 |
0005 | susy | 18 |
0006 | echoo | 21 |
對這個表執(zhí)行這樣一個SQL:
SELECT * FROM employees WHERE ROWNUM > 1;
這句SQL的預(yù)期為取出除第一條數(shù)據(jù)外的所有數(shù)據(jù),但是執(zhí)行的結(jié)果是一條都選不出來,來看執(zhí)行過程:
① select 出的第一條數(shù)據(jù)為
id | name | age |
---|---|---|
0001 | mary | 18 |
② ROWNUM
給這條數(shù)據(jù)賦值,因?yàn)槭堑谝粭l數(shù)據(jù),所以從 1 開始,賦值完是這樣的:
id | name | age | ROWNUM |
---|---|---|---|
0001 | mary | 18 | 1 |
③ 進(jìn)行 WHERE ROWNUM > 1
條件判斷,1>1不滿足條件,所以第一條數(shù)據(jù)被過濾掉
④ select 第二條數(shù)據(jù)
id | name | age |
---|---|---|
0002 | mike | 20 |
⑤ ROWNUM
給這條數(shù)據(jù)賦值,因?yàn)樯弦粭l數(shù)據(jù)被過濾掉了,所以還是從 1 開始,賦值完是這樣的:
id | name | age | ROWNUM |
---|---|---|---|
0002 | mike | 20 | 1 |
⑥ 進(jìn)行 WHERE ROWNUM > 1
條件判斷,1>1不滿足條件,所以這數(shù)據(jù)也被過濾掉
⑦ ·············
一直如此循環(huán)直到結(jié)束,都沒有符合條件的數(shù)據(jù),所以一條數(shù)據(jù)都選不出來!
例1:取前10條數(shù)據(jù)
用ROWNUM
來限制查詢返回的行數(shù),如下例所示:
SELECT * FROM employees WHERE ROWNUM < 11;
WHERE ROWNUM < 11
表示返回查詢數(shù)據(jù)的前10條;
例2:取排序后的前10條數(shù)據(jù)
不能夠像下面這樣直接在WHERE
子句后簡單的加上ORDER BY
子句了
SELECT * FROM employees WHERE ROWNUM < 11 ORDER BY age;
因?yàn)檫@里的意思是先執(zhí)行WHERE
子句選出ROWNUM
1~10的數(shù)據(jù),然后再進(jìn)行排列,和我們預(yù)想不符。我們要的是按年齡排序后的前10條數(shù)據(jù)。
所以應(yīng)該這樣寫:
SELECT * FROM (SELECT * FROM employees ORDER BY employee_id) WHERE ROWNUM < 11;
這里的意思就是先執(zhí)行排序,然后對排完序的結(jié)果集用ROWNUM
偽列按順序編號,然后取其中ROWNUM
為1~10的那10條數(shù)據(jù);
例3:分頁
SELECT * FROM( SELECT temp_table.*,ROWNUM AS rn FROM (SELECT * FROM employees ORDER BY employee_id) temp_table ) result_table WHERE result_table.rn BETWEEN 起始行數(shù) AND 結(jié)尾行數(shù)
通過嵌套查詢的方式,把動態(tài)的ROWNUM
偽列變成固定的列rn
,然后再用rn
列進(jìn)行分頁;
到此這篇關(guān)于Sql奇技淫巧之ROWNUM偽列的文章就介紹到這了,更多相關(guān)Sql奇技淫巧之ROWNUM偽列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mssql查找備注(text,ntext)類型字段為空的方法
在sql語句中,如果查找某個文本字段值為空的,可以用select * from 表 where 字段='' ,但是如果這個字段數(shù)據(jù)類型是text或者ntext,那上面的sql語句就要出錯了。2008-08-08編程經(jīng)驗(yàn)點(diǎn)滴 動態(tài)SQL的拼接技巧
眾多人在回復(fù),其中至少有三位老兄,誤解了動態(tài) SQL 的拼接。特寫此文,闡述一下其中的技巧。希望能糾正初學(xué)者的錯誤2012-09-09SQL Server定時(shí)收縮數(shù)據(jù)庫日志為指定大小的示例代碼
SQL Server提供了DBCC SHRINKFILE 命令來清理事務(wù)日志文件,該命令可以縮小指定文件的大小,并釋放磁盤空間,本文給大家介紹了SQL Server如何定時(shí)收縮數(shù)據(jù)庫日志為指定大小,需要的朋友可以參考下2024-03-03hive中將string數(shù)據(jù)轉(zhuǎn)為bigint的操作
這篇文章主要介紹了hive中將string數(shù)據(jù)轉(zhuǎn)為bigint的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09SqlServer數(shù)據(jù)庫提示 “tempdb” 的日志已滿 問題解決方案
本文主要講述了筆者在執(zhí)行sql語句的過程中,遇到提示“數(shù)據(jù)庫 'tempdb' 的日志已滿。請備份該數(shù)據(jù)庫的事務(wù)日志以釋放一些日志空間。”的解決過程,希望對大家有所幫助2014-08-08SQL Server中數(shù)據(jù)類型轉(zhuǎn)換的原理、使用方法、常見場景示例講解
在SQLServer中,數(shù)據(jù)類型轉(zhuǎn)換包含隱式轉(zhuǎn)換和顯式轉(zhuǎn)換兩種方式,隱式轉(zhuǎn)換由系統(tǒng)自動完成,而顯式轉(zhuǎn)換需要使用CAST或CONVERT函數(shù),本文詳細(xì)講解了數(shù)據(jù)類型轉(zhuǎn)換的原理、使用方法和常見場景,并提供了具體示例,同時(shí),介紹了錯誤處理函數(shù)TRY_CAST和TRY_CONVERT2024-09-09SQL Server 常用函數(shù)使用方法小結(jié)
這篇文章主要介紹了SQL Server 常用函數(shù)使用方法小結(jié),需要的朋友可以參考下2017-05-05sqlserver 手工實(shí)現(xiàn)差異備份的步驟
sqlserver 手工實(shí)現(xiàn)差異備份的步驟,需要的朋友可以參考下。2011-04-04