如果我們經常遇到表里的記錄數(shù)非常龐大(數(shù)萬至數(shù)百萬),而一次只顯示幾十條數(shù)據的情況,就需要用到分頁查詢語句,下面就將為您詳細介紹SQL中的分頁查詢語句,供您參考。
使用SQL語句查詢時,如果表里的記錄數(shù)過于龐大,就需要用到分頁查詢語句,下面就將為您詳細介紹SQL中的分頁查詢語句,供您參考。
在實際中我們經常遇到表里的記錄數(shù)非常龐大(數(shù)萬至數(shù)百萬),而一次只顯示幾十條數(shù)據的情況,如果我們直接用下面的SQL語句查詢并填充到DataTable的話,將是一個非??植赖氖虑?假設UserInfo有幾百萬用戶數(shù)據): Select * from UserInfo
分頁查詢就是根據需要每次只返回所需要的數(shù)據,而不用每次都從數(shù)據庫中全部把數(shù)據提取出來,這樣可以降低程序與數(shù)據庫之間的數(shù)據傳送量,并且還可以提高程序的性能。 一般來說我們在數(shù)據量大的情況下總是會分頁顯示(誰也不會一下子將幾萬條數(shù)據全部一次性顯示給用戶),這樣決定我們返回的查詢結果集的參數(shù)有兩個:當前顯示的頁數(shù)pageIndex和每頁顯示的記錄條數(shù)size。這里來舉例在SQL Server中我們如何寫分頁查詢的SQL語句,假設我們按照UserID字段降序查詢,每頁顯示5條記錄。查詢語句如下:
1 |
select top 5 * from UserInfo order by UserID asc |
第一頁我們可以按照對UserID降序查詢,并利用top 5取出前5條記錄??墒堑诙摰腟QL語句我們該怎么寫呢?第二頁顯示的數(shù)據應該是按照UserID降序排列之后第6條到10條記錄,有沒有辦法做到這一點呢?有兩種辦法:第一種就是前面我所提到的一次性將全部數(shù)據提取并填充到DataTable中,然后在for循環(huán)中通過i從5開始,并且i小于10(因為在C#中所有的集合下標都是從0開始的,第六條記錄的下標就是5)這種方法顯示5條數(shù)據,但是這種做法的缺點我在前面也提到了。第二種辦法就是在數(shù)據庫中過濾。我們通過分析發(fā)現(xiàn),第二頁要顯示的記錄的UserID字段有以下特點:它們是緊跟這第一頁顯示的記錄之后的5條記錄,也就是通過對UserID字段進行降序排列時,它們是除了第一頁數(shù)據之后的5條記錄,也就是它們的UserID不在第一頁的UserID之中,在SQL語句有一個not in這個正好可以排上用場。 首先我們按照對UserID進行降序排序,查詢出前面第一頁使用的數(shù)據的UserID,SQL語句及執(zhí)行結果如下:
1 |
select top 5 * from UserInfo where UserId not in |
2 |
( select top 5 UserID from UserInfo order by UserID asc ) order by UserID asc |
UserID是從1開始,所以UserID在1至5的記錄在第一頁顯示,UserID為6至10的記錄在第二頁顯示,UserID為11至15的記錄在第三頁顯示……依此類推,如果每頁顯示5條記錄,那么第n頁顯示的數(shù)據記錄的公式應該是:
1 |
select top 5 * from UserInfo where UserId not in |
2 |
( select top (n-1)*5 UserID from UserInfo order by UserID asc ) order by UserID asc |
#p#
需要注意的是:上面的查詢,兩次都是對UserID進行排序,并且都是降序,也就是說我們分頁查詢的時候寫這種SQL語句的時候一定要都是對同一字段進行相同方式(asc或desc)的排序查詢,這樣查詢的結果才會正確。 還有一點,如何查詢數(shù)據庫滿足條件的記錄條數(shù)呢? 還記得我講過Command對象的ExecuteScalar()方法吧,這個方法就是返回查詢結果的第一行第一列的。
下面是例子:
02 |
SqlConnection connection = new SqlConnection( "server=localhost;database=pubs;uid=sa;pwd='' " ); |
04 |
SqlCommand command = new SqlCommand( "select count(1) as 男性人數(shù) from UserInfo where sex=1" , connection ); |
08 |
//得到第一行第一列的結果,這里是所有用戶總數(shù) |
09 |
int count = int .Parse(command.ExecuteScalar().ToString()); |
最后一點,如果計算總頁數(shù)的問題。假如我們有20條記錄,每頁顯示5條,毫無疑問總共分4頁顯示。如果是21條記錄呢?答案是分5頁顯示,盡管最后一頁只有一條記錄,但是還是要顯示的。這里也有一個公式,假如總共有m條記錄,每頁顯示n條記錄(這里m,n都是大于0的整數(shù))那么需要顯示全部記錄所用到的頁數(shù)page為:
1 |
page=(m%n)==0?(m/n):(m/n+1); |
【編輯推薦】
批處理SQL語句的執(zhí)行效率提高的方法
SQL語句中特殊字符的處理方法
教您用SQL語句進行模糊查詢
為您講解SQL動態(tài)語句的語法
SQL中隨機數(shù)函數(shù)rand()簡介