首頁> 資料庫> Oracle> 主體

oracle怎麼查詢前10筆記錄

WBOY
發布: 2022-01-25 10:37:21
原創
40447 人瀏覽過

在oracle中,可以利用where子句配合rownum來查詢前十筆記錄,where子句用來限制查詢的條件,rownum用來限制回傳查詢的總行數,語法為「select * from 表名where rownum <=10」。

oracle怎麼查詢前10筆記錄

本教學操作環境:Windows10系統、Oracle 11g版、Dell G3電腦。

oracle怎麼查詢前10筆記錄

在Oracle怎樣查詢表中的top10筆記錄呢?

  select *   from test   where rownum <=10
登入後複製

  下面是關於rownum的介紹

  Rownum和row_number() over()的使用

  ROWNUM是Oracle從8開始提供的一個偽列,是把SQL出來的結果進行編號,總是從1開始,常見的用途就是用來分頁輸出.

  比如

  SELECT *   FROM torderdetail a   WHERE ROWNUM <= 10
登入後複製

  這條語句就是輸出前10條紀錄,在這裡用途上類似於sql sever的top,不過rownum對於指定編號區間的輸出應該說更強大

  SELECT *   FROM (SELECT a.*, ROWNUM rn   FROM torderdetail a)   WHERE rn >= 10 AND rn <= 20
登入後複製

  這條語句即是輸出第10到第20條紀錄,這裡之所以用rownum rn,是把rownum轉成實例,因為rownum本身只能用<=的比較方式,只有轉成實列,這樣就可做>=的比較了。

  在實際用途中,常常會要求取最近的幾條紀錄,這就需要先對紀錄進行排序後再取rownum <=

  一般常見的

  SELECT *   FROM (SELECT a.*   FROM torderdetail a   ORDER BY order_date DESC)   WHERE ROWNUM <= 10
登入後複製

  而在CSDN曾經發生過討論,關於取近的10條紀錄,有人給出這樣的語句

  SELECT a.*   FROM torderdetail a   WHERE ROWNUM <= 10   ORDER BY order_date DESC
登入後複製

  之所以會出現這樣的語句,主要是從效率上的考慮,前面條語句,是要進行全表掃描後再排序,然後再取10條紀錄,後一條語句則不會全表掃描,只會取出10條紀錄,很明顯後條語句的效率會高很多。

  那為什麼會有爭議呢,那就在於在執行順序上爭議,是先執行排序取10條紀錄,還是取10條紀錄,再排序呢?兩種順序取出的結果是截然相反的,先排序再取10條,就是取最近的10條,而先取10條,再排序,則取出的最早的10條紀錄。對於此語句,普遍的認為執行順序是先取10個紀錄再排序的。所以此語句應該是錯誤。但實際上並非如此,此語句的執行順序和order by的字段有關係,如果你order by 的字段是pk,則是先排序,再取10條(速度比第一種語句快),而排序字段不是PK 時,是先取10條再排序,此時結果就與要求不一樣了,所以第二種寫法一定要在排序字段是主鍵的情況下才能保證結果正確。

  Row_number() over()這個分析函數是從9I開始提供的,一般的用途和rownum差不多。

  一般寫法row_number() over( order by order_date desc) 產生的順序和rownum的語句一樣,效率也一樣(對於同樣有order by 的rownum語句來說),所以在這種情況下兩種用法是一樣的。

  而對於分組後取最近的10個紀錄,則是rownum無法實現的,這時只有row_number可以實現,row_number() over(partition by 分組字段order by 排序字段)就能實現分組後編號,比如說要取近一個月的每天最後10個訂單紀錄

  SELECT *   FROM (SELECT a.*,   ROW_NUMBER () OVER (PARTITION BY TRUNC (order_date) ORDER BY order_date DESC)   rn   FROM torderdetail a)   WHERE rn <= 10
登入後複製

  Rownum的另類用法,有時候我們會遇到這種需求,要求輸出當月的所有天數,許多人會煩惱,資料庫裡又沒有這樣的表,怎麼輸出一個月的所有天數呢?用rownum就能解決:

  SELECT TRUNC (SYSDATE, 'MM') + ROWNUM - 1   FROM DUAL   CONNECT BY ROWNUM <= TO_NUMBER (TO_CHAR (LAST_DAY (SYSDATE), 'dd'))
登入後複製

推薦教學:《Oracle影片教學

以上是oracle怎麼查詢前10筆記錄的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!