--page:當前頁 pageNum:每頁顯示條數 select * from goods e limit 2,2; select * from goods e limit (page-1)*pageNum,pageNum;--MySql分頁公式,按照公式來,取值前開後閉:< <=
1. 第一種sql
--公式 --page:當前頁 pageNum:每頁顯示條數 select * from (select stu.*, rownum rn from (select * from stu) stu where rownum <= (page-1)*pageNum+pageNum) where rn > (page-1)*pageNum; --具體例子 select * from (select stu.*, rownum rn from (select * from stu) stu where rownum <= 3) where rn >= 1;
2.第二種oracle
--公式 --page:當前頁 pageNum:每頁顯示條數 select * from (select stu.*, rownum rn from (select * from stu) stu) where rn > (page - 1) * pageNum and rn <= (page - 1) * pageNum + pageNum); --網上這裏用Between閉區間,我以爲不合適這個公式,這個公式要前開後閉 --具體例子 select * from (select stu.*, rownum rn from (select * from stu) stu) where rn <= 3 and rn > 0;
對比這兩種寫法,絕大多數的狀況下,第一種oracle分頁的效率比第二種高得多。對於Oracle推薦第一種優化
這是因爲CBO 優化模式下,Oracle能夠將外層的查詢條件推到內層查詢中,以提升內層查詢的執行效率。對於第一個查詢語句,第二層的查詢條件WHERE ROWNUM <= 3就能夠被Oracle推入到內層查詢中,這樣Oracle查詢的結果一旦超過了ROWNUM限制條件,就終止查詢將結果返回了。而第二個查詢語句,因爲查詢條件rn <= 3 and rn > 0blog
是存在於查詢的第三層,而Oracle沒法將第三層的查詢條件推到最內層(即便推到最內層也沒有意義,由於最內層查詢不知道RN表明什麼)。所以,對於第二種查詢語句,Oracle最內層返回給中間層的是全部知足條件的數據,而中間層返回給最外層的也是全部數據。數據的過濾在最外層完成,顯然這個效率要比第一個查詢低得多。it