在Oracle怎樣查詢表中的top10條記錄呢?html
select * from test where rownum <=10 ----說明:rownum只能用於<或<=運算,若是要用>運算符就要用到嵌套查詢。sql
下面是關於rownum的介紹:數據庫
Rownum和row_number()、over()的使用函數
ROWNUM是Oracle從8開始提供的一個僞列,是把SQL出來的結果進行編號,始終從1開始,常見的用途就是用來分頁輸出..net
好比htm
SELECT * FROM torderdetail a WHERE ROWNUM <= 10blog
這條語句就是輸出前10條紀錄,在這裏用途上相似於sql sever的top,不過rownum對於指定編號區間的輸出應該說更強大排序
SELECT *get
FROM (SELECT a.*, ROWNUM rn FROM torderdetail a)it
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'))
原文出自【比特網】,轉載請保留原文連接:http://soft.chinabyte.com/database/27/11420027.shtml
=====================================================================================
因爲Oracle不支持select top 語句,因此在Oracle中常常是用order by 跟rownum
的組合來實現select top n的查詢。
簡單地說,實現方法以下所示:
select 列名1 …列名n from
(
select 列名1 …列名n
from 表名 order by 列名1
)
where rownum <=N(抽出記錄數)
order by rownum asc
如:select id,name from (select id,name from student order by name) where rownum<=10 order by rownum asc
按姓名排序取出前十條數據
附:好比取100-150條數據的方法:
(1)最佳選擇:利用分析函數
row_number() over ( partition by col1 order by col2 )
好比想取出100-150條記錄,按照tname排序
select tname,tabtype from (
select tname,tabtype,row_number() over ( order by tname ) rn from tab
) where rn between 100 and 150;
(2)使用rownum 虛列
select tname,tabtype from (
select tname,tabtype,rownum rn from tab where rownum <= 150
) where rn >= 100;