先來(lái)看兩段代碼:
第一段代碼要比第二段高效很多,這是由于在CBO 優(yōu)化模式下,Oracle可以將外層的查詢條件推到內(nèi)層查詢中,以提高內(nèi)層查詢的執(zhí)行效率。第一段代碼中,第二層的查詢條件WHERE ROWNUM <= 40就可以被Oracle推入到內(nèi)層查詢中,這樣Oracle查詢的結(jié)果一旦超過(guò)了ROWNUM限制條件,就終止查詢將結(jié)果返回了。
ROWNUM是一個(gè)偽列,用于記錄返回結(jié)果集中每一行的行號(hào)。ROWNUM是在查詢結(jié)果返回之后計(jì)算的,因此它并不是存儲(chǔ)在表中的實(shí)際列。ROWNUM的作用是用于限制查詢結(jié)果的行數(shù),可以在SELECT語(yǔ)句中使用WHERE子句和ORDER BY子句,實(shí)現(xiàn)分頁(yè)查詢或篩選查詢結(jié)果。
其中,start_row和end_row分別表示查詢的起始行和結(jié)束行。
舉例說(shuō)明:
查詢operation表前五行
需要注意:1.Rownum是Oracle數(shù)據(jù)庫(kù)中的一種偽列,它不是一個(gè)真實(shí)的列,而是Oracle在運(yùn)行時(shí)自動(dòng)分配給每一行的一個(gè)行號(hào)。
2.ROWNUM是在查詢結(jié)果返回之后再進(jìn)行排序的,因此需要使用子查詢來(lái)實(shí)現(xiàn)分頁(yè)查詢
3.在使用ROWNUM函數(shù)實(shí)現(xiàn)分頁(yè)查詢時(shí),需要注意排序的方式,以確保查詢結(jié)果的正確性。