數據庫分段查詢技術的實現
????分段查詢的意思是,在查詢數據時不是一次性全部將附合條件的數據都讀取在內存里。一次性將數據全部查詢出來,將降低查詢效率,給客戶端的反應會很長時間,而分段查詢的意思是按照當前分頁的大小,每次查詢的結果就是每頁顯示的數量,大大提升了查詢效率
例如數據庫中有100000條數據,每頁20條,當點擊頁碼的時候,只查詢該頁碼需要顯示的那20條內容,不查詢別的頁面的,即每次只查詢20條數據
??SQL Server
從數據庫表中的第M條記錄開始取N條記錄,利用Top關鍵字:注意如果Select語句中既有top,又有order by,則是從排序好的結果集中選擇:
SELECT *
FROM?(?SELECT?Top?N?* FROM?(SELECT?Top?(M?+?N?-?1)?*?FROM?表名稱?Order?by?主鍵?desc)?t1?)?t2 Order?by?主鍵?asc
例如從表Sys_option(主鍵為sys_id)中從10條記錄還是檢索20條記錄,語句如下:
SELECT?* FROM?(?SELECT?TOP?20?* ?FROM?(SELECT?TOP?29?*?FROM?Sys_option?order?by?sys_id?desc)?t1)?t2 Order?by?sys_id?asc
?Oralce數據庫
從數據庫表中第M條記錄開始檢索N條記錄
SELECT?* FROM?(SELECT?ROWNUM?r,t1.*?From?表名稱?t1?where?rownum?=?M
例如從表Sys_option(主鍵為sys_id)中從10條記錄還是檢索20條記錄,語句如下:
SELECT?* FROM?(SELECT?ROWNUM?R,t1.*?From?Sys_option?where?rownum?=?10
MySQL數據庫
My sql數據庫最簡單,是利用mysql的LIMIT函數,LIMIT [offset,] rows從數據庫表中M條記錄開始檢索N條記錄的語句為:
以下是代碼片段:
SELECT?*?FROM?表名稱?LIMIT?M,N
例如從表Sys_option(主鍵為sys_id)中從10條記錄還是檢索20條記錄,語句如下:
以下是代碼片段:
select?*?from?sys_option?limit?10,20
以前用ORACLE時,分頁使用ROWNUM做條件就可以了,不管效率如何,反正實現起來比較容易。
那么ACCESS如何實現分頁功能呢?看了些資料說得有些復雜,要寫好些代碼,我想到一個好方法,來跟大家分享,也就是一個SQL語句:
select top 15 * from YOURTABLE where ID not in(select top 15 ID from YOURTABLE order by ID desc)? order by ID desc
稍解釋一下,15呢是每頁的行數,YOURTABLE是表名,ID是表中主鍵字段(當然你也可以用別的),我上面的SQL語句,是取出第二頁(第二個15條)記錄。想變頁碼,只要把后面的15變成相應的倍數就可以了。
用這種方式,結合不帶分頁功能的DataRepeater插件,我三下五除二就寫好的記事本程序。不要笑話我,我的.NET的新手,先寫這個練練手。
如果有人感興趣,請留言,我可以把代碼貼出來。
請注意:
如果取第一個15條記錄,SQL語句不能這樣寫:
select?top?15??*??from?YOURTABLE?where?ID?not?in(select?top?0?ID?from?YOURTABLE?order?by?ID?desc)??order?by?ID?desc
這樣寫會報錯。直接寫成:
select?top?15??*??from?YOURTABLE???order?by?ID?desc
如果要加限制條件,可以這樣寫:
select?top?15??*??from?YOURTABLE?where?ID?not?in(select?top?15?ID?from?YOURTABLE?where??NAME='wallimn'?order?by?ID?desc)?and?NAME='wallimn'??order?by?ID?desc