oracle怎樣查詢前10條記錄

oracle中,可以利用where子句配合rownum來查詢前十條記錄,where子句用于限制查詢的條件,rownum用于限制返回查詢的總行數(shù),語法為“select * from 表名 where rownum

oracle怎樣查詢前10條記錄

本教程操作環(huán)境:Windows10系統(tǒng)、Oracle 11g版、Dell G3電腦。

oracle怎樣查詢前10條記錄

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

  select?*   from?test   where?rownum?<p>  下面是關(guān)于rownum的介紹</p><p>  Rownum和row_number() over()的使用</p><p>  ROWNUM是Oracle從8開始提供的一個(gè)偽列,是把sql出來的結(jié)果進(jìn)行編號,始終從1開始,常見的用途就是用來分頁輸出.</p><p>  比如</p><pre class="brush:sql;toolbar:false">  SELECT?*   FROM?torderdetail?a   WHERE?ROWNUM?<p>  這條語句就是輸出前10條紀(jì)錄,在這里用途上類似于sql sever的top,不過rownum對于指定編號區(qū)間的輸出應(yīng)該說更強(qiáng)大</p><pre class="brush:sql;toolbar:false">  SELECT?*   FROM?(SELECT?a.*,?ROWNUM?rn   FROM?torderdetail?a)   WHERE?rn?&gt;=?10?AND?rn?<p>  這條語句即是輸出第10到第20條紀(jì)錄,這里之所以用rownum rn,是把rownum轉(zhuǎn)成實(shí)例,因?yàn)閞ownum本身只能用 =的比較了。</p><p>  在實(shí)際用途中,常常會要求取最近的幾條紀(jì)錄,這就需要先對紀(jì)錄進(jìn)行排序后再取rownum </p><p>  一般常見的</p><pre class="brush:sql;toolbar:false">  SELECT?*   FROM?(SELECT?a.*   FROM?torderdetail?a   ORDER?BY?order_date?DESC)   WHERE?ROWNUM?<p>  而在CSDN曾經(jīng)發(fā)生過討論,關(guān)于取近的10條紀(jì)錄,有人給出這樣的語句</p><pre class="brush:sql;toolbar:false">  SELECT?a.*   FROM?torderdetail?a   WHERE?ROWNUM?<p>  之所以會出現(xiàn)這樣的語句,主要是從效率上的考慮,前面條語句,是要進(jìn)行全表掃描后再排序,然后再取10條紀(jì)錄,后一條語句則不會全表掃描,只會取出10條紀(jì)錄,很明顯后條語句的效率會高許多。</p><p>  那為什么會有爭議呢,那就在于在執(zhí)行順序上爭議,是先執(zhí)行排序取10條紀(jì)錄,還是取10條紀(jì)錄,再排序呢?兩種順序取出來的結(jié)果是截然相反的,先排序再取10條,就是取最近的10條,而先取10條,再排序,則取出的最早的10條紀(jì)錄。對于此語句,普遍的認(rèn)為執(zhí)行順序是先取10條紀(jì)錄再排序的。所以此語句應(yīng)該是錯(cuò)誤。但實(shí)際上并非如此,此語句的執(zhí)行順序和order by的字段有關(guān)系,如果你order by 的字段是pk,則是先排序,再取10條(速度比第一種語句快),而排序字段不是PK 時(shí),是先取10條再排序,此時(shí)結(jié)果就與要求不一樣了,所以第二種寫法一定要在排序字段是主鍵的情況下才能保證結(jié)果正確。</p><p>  Row_number() over()這個(gè)分析函數(shù)是從9I開始提供的,一般的用途和rownum差不多。</p><p>  一般寫法row_number() over( order by order_date desc) 生成的順序和rownum的語句一樣,效率也一樣(對于同樣有order by 的rownum語句來說),所以在這種情況下兩種用法是一樣的。</p><p>  而對于分組后取最近的10條紀(jì)錄,則是rownum無法實(shí)現(xiàn)的,這時(shí)只有row_number可以實(shí)現(xiàn),row_number() over(partition by 分組字段 order by 排序字段)就能實(shí)現(xiàn)分組后編號,比如說要取近一個(gè)月的每天最后10個(gè)訂單紀(jì)錄</p><pre class="brush:sql;toolbar:false">  SELECT?*   FROM?(SELECT?a.*,   ROW_NUMBER?()?OVER?(PARTITION?BY?TRUNC?(order_date)?ORDER?BY?order_date?DESC)   rn   FROM?torderdetail?a)   WHERE?rn?<p>  Rownum的另類用法,有時(shí)候我們會遇到這種需求,要求輸出當(dāng)月的所有天數(shù),許多人會煩惱,數(shù)據(jù)庫里又沒有這樣的表,怎么輸出一個(gè)月的所有天數(shù)呢?用rownum就能解決:</p><pre class="brush:sql;toolbar:false">  SELECT?TRUNC?(SYSDATE,?'MM')?+?ROWNUM?-?1   FROM?DUAL   CONNECT?BY?ROWNUM?<p>推薦教程:《<a href="https://www.php.cn/course/list/52.html" target="_blank">Oracle視頻教程</a>》</p>

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊9 分享