Sql奇技淫巧之ROWNUM偽列

ROWNUM偽列

ROWNUM是一個偽列,它是根據每次查詢的結果動態生成的一列遞增編號,表示 Oracle 從表中選擇該行的順序,選擇的第一行ROWNUM為1,第二行ROWNUM為2,以此類推。

注意1:

ROWNUM偽列是在WHERE子句之前生成的,就是說它并不是在執行了WHERE子句過濾之后再對數據編號
比如在執行WHERE子句,結果數據是這樣的:

idnameageROWNUM
0001mary181
0002mike202
0003john193
0004kitty164
0005susy185
0006echoo216

這時候的ROWNUM是一列遞增排列的、完整的編號
然后如果執行一個WHERE子句:WHERE age >18
那數據就變成了:

idnameageROWNUM
0002mike202
0003john193
0004kitty216

ROWNUM出現了斷層,不連續了
如果后面再執行一個ORDER BY age DESC
就變成這樣了:

idnameageROWNUM
0004kitty216
0002mike202
0003john193

ROWNUM不按順序排了
所以在利用ROWNUM偽列來對結果集做限制、過濾、排序、分頁等操作的時候一定要注意這個點,不然很容易錯亂;

注意2:

ROWNUM是一行一行賦值的,只有上一行數據被選擇成功,下一行才會遞增!而且 select 語句也是一行一行選擇的,每 select 一行數據就要進行 where 條件判斷。
比如有這樣一個employees表:

idnameage
0001mary18
0002mike20
0003john19
0004kitty16
0005susy18
0006echoo21

對這個表執行這樣一個SQL:

SELECT * FROM employees WHERE ROWNUM > 1;

這句SQL的預期為取出除第一條數據外的所有數據,但是執行的結果是一條都選不出來,來看執行過程:

① select 出的第一條數據為

idnameage
0001mary18

ROWNUM 給這條數據賦值,因為是第一條數據,所以從 1 開始,賦值完是這樣的:

idnameageROWNUM
0001mary181

③ 進行 WHERE ROWNUM > 1 條件判斷,1>1不滿足條件,所以第一條數據被過濾掉
④ select 第二條數據

idnameage
0002mike20

ROWNUM 給這條數據賦值,因為上一條數據被過濾掉了,所以還是從 1 開始,賦值完是這樣的:

idnameageROWNUM
0002mike201

⑥ 進行 WHERE ROWNUM > 1 條件判斷,1>1不滿足條件,所以這數據也被過濾掉
⑦ ·············
一直如此循環直到結束,都沒有符合條件的數據,所以一條數據都選不出來!

例1:取前10條數據

ROWNUM來限制查詢返回的行數,如下例所示:

SELECT * FROM employees WHERE ROWNUM < 11;

WHERE ROWNUM < 11表示返回查詢數據的前10條;

例2:取排序后的前10條數據

不能夠像下面這樣直接在WHERE子句后簡單的加上ORDER BY子句了

SELECT * FROM employees WHERE ROWNUM < 11 ORDER BY age;

因為這里的意思是先執行WHERE子句選出ROWNUM1~10的數據,然后再進行排列,和我們預想不符。我們要的是按年齡排序后的前10條數據。
所以應該這樣寫:

SELECT *FROM (SELECT * FROM employees ORDER BY employee_id)WHERE ROWNUM < 11;

這里的意思就是先執行排序,然后對排完序的結果集用ROWNUM偽列按順序編號,然后取其中ROWNUM為1~10的那10條數據;

例3:分頁

SELECT * 
FROM( SELECT temp_table.*,ROWNUM AS rnFROM (SELECT * FROM employees ORDER BY employee_id) temp_table) result_table
WHERE result_table.rn BETWEEN 起始行數 AND 結尾行數

通過嵌套查詢的方式,把動態的ROWNUM偽列變成固定的列rn,然后再用rn列進行分頁;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35513.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35513.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35513.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

torch.profiler

什么是torch.profiler PyTorch Profiler 是一個工具&#xff0c;它允許在訓練和推理期間收集性能指標。Profiler 的上下文管理器 API 可用于更好地了解哪些模型操作最昂貴&#xff0c;檢查它們的輸入形狀和調用堆棧&#xff0c;研究設備內核活動并可視化執行跟蹤。 性能指標&…

騰訊出品Pag動畫框架在Android端的使用-初級

Pag動畫框架作為一個第三方框架&#xff0c;它的優缺點與Lottie是相似&#xff0c;此處不過多贅述。如果你們的項目中打算用了&#xff0c;肯定是經過了一定的調研的。Pag動畫框架分幾個版本&#xff0c;有免費的有收費的。我們目前用的社區免費版&#xff0c;只用來展示Pag動畫…

項目實戰 — 消息隊列(8){網絡通信設計②}

目錄 一、客戶端設計 &#x1f345; 1、設計三個核心類 &#x1f345; 2、完善Connection類 &#x1f384; 讀取請求和響應、創建channel &#x1f384; 添加掃描線程 &#x1f384; 處理不同的響應 &#x1f384; 關閉連接 &#x1f345; 3、完善Channel類 &#x1f384; 編…

廣州華銳互動:VR3D課程在線教育平臺為職業院校提供沉浸式的虛擬現實學習體驗

隨著科技的飛速發展&#xff0c;虛擬現實(VR)和增強現實(AR)技術已經逐漸滲透到我們生活的各個領域。其中&#xff0c;VR3D課程在線教育平臺作為一種新興的教育方式&#xff0c;正在逐漸改變我們的學習方式和體驗。本文將詳細介紹VR3D課程在線教育平臺的應用前景及特點。 VR3D課…

VFP現代物流企業管理系統的設計與實現

摘要: 隨著計算機技術的廣泛應用,在現代流通企業管理中引入計算機管理技術,成為一個值得深入研究的問題。 本文首先概要的論述了數據庫的有關知識與現狀。之后,對當代計算機數據庫技術的現狀,尤其是對關系型數據庫作了系統的描述。在此基礎上,論文重點對數據庫的開發環境 …

【設計模式】工廠模式

工廠模式 工廠模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的設計模式之一。這種類型的設計模式屬于創建型模式&#xff0c;它提供了一種創建對象的最佳方式。 工廠模式提供了一種將對象的實例化過程封裝在工廠類中的方式。通過使用工廠模式&#xff0c;可以…

Mysql整理二 - 常見查詢語句面試題(附原表)

表結構&#xff0c;創建原表的代碼在最后 -- cid課程id; tid老師id; sid學生id; select * from t_mysql_course; select * from t_mysql_score; select * from t_mysql_student; select * from t_mysql_teacher; 1. 查詢" 01 “課程比” 02 "課程成績高的學生的信息…

uniapp軟鍵盤談起遮住輸入框和頭部被頂起的問題解決

推薦&#xff1a; pages.json中配置如下可解決頭部被頂起和表單被遮住的問題。 { "path": "pages/debug/protocol/tagWord", "style": { "app-plus": { "soft…

01.setup,reactive,ref,computed,watch學習---2023新版Vue3基礎入門到實戰項目

1.Vue3組合式 2.創建vue3項目 2.1認識create-vue create-vue是官方新的腳手架工具&#xff0c;vite下一代構建工具 node -v >16 npm init vuelatest 2.2 setup 原始寫法 <script> export default {//執行時機比beforeCreate早//獲取不到this//數據和函數必須ret…

Java實戰:高效提取PDF文件指定坐標的文本內容

前言 臨時接到一個緊急需要處理的事項。業務側一個同事有幾千個PDF文件需要整理&#xff1a;需要從文件中的指定位置獲取對應的編號和地址。 要的急&#xff0c;工作量大。所以就問到技術部有沒有好的解決方案。 問技術的話就只能寫個demo跑下了。 解決辦法 1. 研究下PDF文檔…

案例15 Spring Boot入門案例

1. 選擇Spring Initializr快速構建項目 ? 2. 設置項目信息 ? 3. 選擇依賴 ? 4. 設置項目名稱 ? 5. 項目結構 ? 6. 項目依賴 自動配置了Spring MVC、內置了Tomcat、配置了Logback(日志)、配置了JSON。 ? 7. 創建HelloController類 com.wfit.boot.hello目錄下創建HelloCo…

Less和Sass的原理和用法

一、原理 1.1 Less定義&#xff1a;是一種動態的樣式語言,使CSS變成一種動態的語言特性&#xff0c;如變量、繼承、運算、函數。Less既可以在客戶端上面運行(支持IE6以上版本、Webkit、Firefox),也可以在服務端運行(Node.js) 1.2 SaSS定義&#xff1a;是一種動態樣式語言&#…

開發過程中遇到的問題以及解決方法

鞏固基礎&#xff0c;砥礪前行 。 只有不斷重復&#xff0c;才能做到超越自己。 能堅持把簡單的事情做到極致&#xff0c;也是不容易的。 開發過程中遇到的問題以及解決方法 簡單易用的git命令 git命令&#xff1a; 查看有幾個分支&#xff1a;git branch -a 切換分支&#…

Azure創建第一個虛擬機

首先&#xff0c;登錄到 Azure 門戶 (https://portal.azure.com/)。在 Azure 門戶右上角&#xff0c;點擊“虛擬機”按鈕&#xff0c;并點擊創建&#xff0c;創建Azure虛擬機。 在虛擬機創建頁面中&#xff0c;選擇所需的基本配置&#xff0c;包括虛擬機名稱、操作系統類型和版…

【JVM】JVM 調優的參數都有哪些?

文章目錄 1. 設置堆空間大小2. 虛擬機棧的設置3. 年輕代中Eden區和兩個Survivor區的大小比例4. 年輕代晉升老年代閾值5. 設置垃圾回收收集器 1. 設置堆空間大小 設置堆的初始大小和最大大小&#xff0c;為了防止垃圾收集器在初始大小、最大大小之間收縮堆而產生額外的時間&…

python編程小游戲簡單的,python小游戲編程100例

大家好&#xff0c;給大家分享一下python編程小游戲簡單的&#xff0c;很多人還不知道這一點。下面詳細解釋一下。現在讓我們來看看&#xff01; 不會python就不能用python開發入門級的小游戲&#xff1f; 當然不是&#xff0c;我收集了十個python入門小游戲的源碼和教程&#…

分支語句和循環語句(1)

這篇文章我們詳細的把分支語句和循環語句給大家進行講解。 分支語句&#xff1a; if switch 循環語句&#xff1a; while for do while goto語句&#xff1a; 1.什么是語句&#xff1f; C語句可分為以下五類&#xff1a; 1. 表達式語句 2. 函數調用語句 3. 控制…

qt自己實現方便的線程管理類

看本博客之前&#xff0c;可以先看看我這篇多線程博客&#xff1a;qt多線程使用方式_我是標同學的博客-CSDN博客

ORCA優化器淺析——CDXLOperator Base class for operators in a DXL tree

如上圖所示&#xff0c;CDXLOperator作為Base class for operators in a DXL tree&#xff0c;其子類CDXLLogical、CDXLScalar、CDXLPhysical作為邏輯節點、物理節點和Scalar節點的DXL表示類&#xff0c;因此其包含了這些類的共同部分特性&#xff0c;比如獲取其DXL節點表示的函…

Qt 文件對話框使用 Deepin風格

當你在Deepin或UOS 上開發 Qt 程序時&#xff0c;如果涉及到文件對話框功能&#xff0c;那么就會遇到調用原生窗口的問題。 如果你使用的是官方的Qt版本&#xff0c;那么在Deepin或者UOS系統上&#xff0c;彈出的文件對話框會是如下這樣&#xff1a; 而Deepin或UOS系統提供的默…