天天看點

SQL分頁查詢代碼

sql server

關于分頁 sql 的資料許多,有的使用存儲過程,有的使用遊标。本人不喜歡使用遊标,我覺得它耗資、效率低;使用存儲過程是個不錯的選擇,因為存儲過程是颠末預編譯的,執行效率高,也更靈活。先看看單條 sql 語句的分頁 sql 吧。

方法1:

适用于 sql server 2000/2005

select top 頁大小 * from table1 where id not in ( select top 頁大小*(頁數-1) id from table1 order by id ) order by id

方法2:

select top 頁大小 * from table1 where id > ( select isnull(max(id),0) from ( select top 頁大小*(頁數-1) id from table1 order by id ) a ) order by id

方法3:

适用于 sql server 2005

select top 頁大小 * from ( select row_number() over (order by id) as rownumber,* from table1 ) a where rownumber > 頁大小*(頁數-1)

說明,頁大小:每頁的行數;頁數:第幾頁。使用時,請把“頁大小”以及“頁大小*(頁數-1)”替換成數位。

mysql

select * from tt limit 1,20

select * from tt limit 21,30

/*

如果你是幾千上萬資料,就直接使用mysql自帶的函數 limit的普通用法就ok了,如果是100萬以上的資料,可能就要講方法了,下面我們來做個百萬級資料的分頁查詢語句.

mysql> select * from news where id>=(select id from news limit 490000,1) limit 10;    //0.18 sec  //很 明顯,這 種方式勝出 .

mysql> select * from news limit 490000,10  //0.22 sec;

*/

 select * from 表名稱 limit m,n 

例如從表sys_option(主鍵為sys_id)中從第10條記錄開始檢索20條記錄,語句如下:

select * from sys_option limit 10,20  

select * from table [查詢條件] order by id limit ?,?  

<a target="_blank" href="http://www.2cto.com/database/oracle/">oracle</a>

oracle的分頁查詢語句基本上可以按照這篇了,下一篇文章會通過例子來申述。下面簡單讨論一下多表聯合的情況。對最多見的等值表連接配接查詢,cbo 一般可能會采用兩種連接配接方式nested loop以及hash join(merge join效率比hash join效率低,一般cbo不會考慮)。在這裡,由于使用了分頁,是以指定了一個歸回的最大記載數,nested loop在歸回記載數跨越最大值時可以頓時遏制并将結果歸回給中心層,而hash join必需處理完所有成集(merge join也是)。那麼在大部分的情況下,對分頁查詢選擇nested

loop作為查詢的連接配接方法具有較高的效率(分頁查詢的時候絕大部分的情況是查詢前幾頁的資料,越靠後面的頁數通路機率越小)。

是以,如果不介意在體系中使用hint的話,可以将分頁的查詢語句改寫為:

select /*+ first_rows */ * from

(

select a.*, rownum rn

from (select * from table_name) a

where rownum &lt;= 40

)

where rn &gt;= 21