1. 程式人生 > >Oracle查詢前多少條記錄的方法

Oracle查詢前多少條記錄的方法

在查詢的時候經常遇見這樣的問題,即----查詢資料庫中前多少條的記錄,那麼這個是怎麼實現的呢?

這裡我們要用到ROWNUM,也就是偽列。

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

比如下面例子:

1.

SELECT name FROM student WHERE ROWNUM<=5

這條語句就是輸出student表中前5個學生姓名,在這裡用途上類似於sql sever的top,不過rownum對於指定區間的輸出應該說更好用。

2.

SELECT name FROM (SELECT s.*, ROWNUM rn FROM student s) WHERE rn >= 5 AND rn <= 10


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

3.

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

一般常見的語句有:

(1)

SELECT name

FROM (SELECT s.name

FROM student s

ORDER BY order_date DESC)

WHERE ROWNUM <= 10

(2)

SELECT s.name

FROM student s

WHERE ROWNUM <= 10

ORDER BY order_date DESC

這兩種語句都有一定的道理,之所以出現這種情況,主要還是因為查詢效率的不同。前面條語句,是要進行全表掃描後再排序,然後再取10條紀錄,後一條語句則不會全表掃描,只會取出10條紀錄,很明顯後條語句的效率會高許多。


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