IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁數(shù)據(jù)庫Oracle → Oracle中查詢前10條記錄

Oracle中查詢前10條記錄

時(shí)間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)

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

  select *

  from test

  where rownum <=10

  下面是關(guān)于rownum的介紹

  ================================

  Rownum和row_number() over()的使用

  ROWNUM是Oracle從8開始提供的一個(gè)偽列,是把SQL出來的結(jié)果進(jìn)行編號(hào),始終從1開始,常見的用途就是用來分頁輸出.

  比如

  SELECT *

  FROM torderdetail a

  WHERE ROWNUM <= 10

  這條語句就是輸出前10條紀(jì)錄,在這里用途上類似于sql sever的top,不過rownum對(duì)于指定編號(hào)區(qū)間的輸出應(yīng)該說更強(qiáng)大

  SELECT *

  FROM (SELECT a.*, ROWNUM rn

  FROM torderdetail a)

  WHERE rn >= 10 AND rn <= 20

  這條語句即是輸出第10到第20條紀(jì)錄,這里之所以用rownum rn,是把rownum轉(zhuǎn)成實(shí)例,因?yàn)閞ownum本身只能用 <=的比較方式,只有轉(zhuǎn)成實(shí)列,這樣就可做 >=的比較了。

  在實(shí)際用途中,常常會(huì)要求取最近的幾條紀(jì)錄,這就需要先對(duì)紀(jì)錄進(jìn)行排序后再取rownum <=

  一般常見的

  SELECT *

  FROM (SELECT? a.*

  FROM torderdetail a

  ORDER BY order_date DESC)

  WHERE ROWNUM <= 10

  而在CSDN曾經(jīng)發(fā)生過討論,關(guān)于取近的10條紀(jì)錄,有人給出這樣的語句

  SELECT? a.*

  FROM torderdetail a

  WHERE ROWNUM <= 10

  ORDER BY order_date DESC

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

  那為什么會(huì)有爭(zhēng)議呢,那就在于在執(zhí)行順序上爭(zhēng)議,是先執(zhí)行排序取10條紀(jì)錄,還是取10條紀(jì)錄,再排序呢??jī)煞N順序取出來的結(jié)果是截然相反的,先排序再取10條,就是取最近的10條,而先取10條,再排序,則取出的最早的10條紀(jì)錄。對(duì)于此語句,普遍的認(rèn)為執(zhí)行順序是先取10條紀(jì)錄再排序的。所以此語句應(yīng)該是錯(cuò)誤。但實(shí)際上并非如此,此語句的執(zhí)行順序和order by的字段有關(guān)系,如果你order by 的字段是pk,則是先排序,再取10條(速度比第一種語句快),而排序字段不是PK 時(shí),是先取10條再排序,此時(shí)結(jié)果就與要求不一樣了,所以第二種寫法一定要在排序字段是主鍵的情況下才能保證結(jié)果正確。

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

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

  而對(duì)于分組后取最近的10條紀(jì)錄,則是rownum無法實(shí)現(xiàn)的,這時(shí)只有row_number可以實(shí)現(xiàn),row_number() over(partition by 分組字段 order by 排序字段)就能實(shí)現(xiàn)分組后編號(hào),比如說要取近一個(gè)月的每天最后10個(gè)訂單紀(jì)錄

  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的另類用法,有時(shí)候我們會(huì)遇到這種需求,要求輸出當(dāng)月的所有天數(shù),許多人會(huì)煩惱,數(shù)據(jù)庫里又沒有這樣的表,怎么輸出一個(gè)月的所有天數(shù)呢?用rownum就能解決:

  SELECT??? TRUNC (SYSDATE, 'MM') + ROWNUM - 1

  FROM DUAL

  CONNECT BY ROWNUM <= TO_NUMBER (TO_CHAR (LAST_DAY (SYSDATE), 'dd'))

關(guān)鍵詞標(biāo)簽:Oracle

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 Oracle中使用alter table來增加,刪除,修改列的語法 Oracle中使用alter table來增加,刪除,修改列的語法 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 誤刪Oracle數(shù)據(jù)庫實(shí)例的控制文件 誤刪Oracle數(shù)據(jù)庫實(shí)例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索 為UNIX服務(wù)器設(shè)置Oracle全文檢索

相關(guān)下載

    人氣排行 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 Oracle中使用alter table來增加,刪除,修改列的語法 ORACLE SQL 判斷字符串是否為數(shù)字的語句 ORACLE和SQL語法區(qū)別歸納(1) oracle grant 授權(quán)語句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法