使用SQL語句查詢時,如果表里的記錄數(shù)過于龐大,就需要用到分頁查詢語句,下面就將為您詳細(xì)介紹SQL中的分頁查詢語句,供您參考。

在實際中我們經(jīng)常遇到表里的記錄數(shù)非常龐大(數(shù)萬至數(shù)百萬),而一次只顯示幾十條數(shù)據(jù)的情況,如果我們直接用下面的SQL語句查詢并填充到DataTable的話,將是一個非常恐怖的事情(假設(shè)UserInfo有幾百萬用戶數(shù)據(jù)): Select * from UserInfo
分頁查詢就是根據(jù)需要每次只返回所需要的數(shù)據(jù),而不用每次都從數(shù)據(jù)庫中全部把數(shù)據(jù)提取出來,這樣可以降低程序與數(shù)據(jù)庫之間的數(shù)據(jù)傳送量,并且還可以提高程序的性能。 一般來說我們在數(shù)據(jù)量大的情況下總是會分頁顯示(誰也不會一下子將幾萬條數(shù)據(jù)全部一次性顯示給用戶),這樣決定我們返回的查詢結(jié)果集的參數(shù)有兩個:當(dāng)前顯示的頁數(shù)pageIndex和每頁顯示的記錄條數(shù)size。這里來舉例在SQL Server中我們?nèi)绾螌懛猪摬樵兊腟QL語句,假設(shè)我們按照UserID字段降序查詢,每頁顯示5條記錄。查詢語句如下:
view source print ?
1 |
select top 5 * from UserInfo order by UserID asc |
第一頁我們可以按照對UserID降序查詢,并利用top 5取出前5條記錄??墒堑诙摰腟QL語句我們該怎么寫呢?第二頁顯示的數(shù)據(jù)應(yīng)該是按照UserID降序排列之后第6條到10條記錄,有沒有辦法做到這一點呢?有兩種辦法:第一種就是前面我所提到的一次性將全部數(shù)據(jù)提取并填充到DataTable中,然后在for循環(huán)中通過i從5開始,并且i小于10(因為在C#中所有的集合下標(biāo)都是從0開始的,第六條記錄的下標(biāo)就是5)這種方法顯示5條數(shù)據(jù),但是這種做法的缺點我在前面也提到了。第二種辦法就是在數(shù)據(jù)庫中過濾。我們通過分析發(fā)現(xiàn),第二頁要顯示的記錄的UserID字段有以下特點:它們是緊跟這第一頁顯示的記錄之后的5條記錄,也就是通過對UserID字段進(jìn)行降序排列時,它們是除了第一頁數(shù)據(jù)之后的5條記錄,也就是它們的UserID不在第一頁的UserID之中,在SQL語句有一個not in這個正好可以排上用場。 首先我們按照對UserID進(jìn)行降序排序,查詢出前面第一頁使用的數(shù)據(jù)的UserID,SQL語句及執(zhí)行結(jié)果如下:
view source print ?
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ù)據(jù)記錄的公式應(yīng)該是:
view source print ?
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進(jìn)行排序,并且都是降序,也就是說我們分頁查詢的時候?qū)戇@種SQL語句的時候一定要都是對同一字段進(jìn)行相同方式(asc或desc)的排序查詢,這樣查詢的結(jié)果才會正確。 還有一點,如何查詢數(shù)據(jù)庫滿足條件的記錄條數(shù)呢? 還記得我講過Command對象的ExecuteScalar()方法吧,這個方法就是返回查詢結(jié)果的第一行第一列的。
下面是例子:
view source print ?
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 |
//得到第一行第一列的結(jié)果,這里是所有用戶總數(shù) |
09 |
int count = int.Parse(command.ExecuteScalar().ToString()); |
10 |
//關(guān)閉Connection對象 |
最后一點,如果計算總頁數(shù)的問題。假如我們有20條記錄,每頁顯示5條,毫無疑問總共分4頁顯示。如果是21條記錄呢?答案是分5頁顯示,盡管最后一頁只有一條記錄,但是還是要顯示的。這里也有一個公式,假如總共有m條記錄,每頁顯示n條記錄(這里m,n都是大于0的整數(shù))那么需要顯示全部記錄所用到的頁數(shù)page為:
view source print ?
1 |
page=(m%n)==0?(m/n):(m/n+1); |
分享文章:SQL中的分頁查詢語句介紹
網(wǎng)站網(wǎng)址:
http://m.fisionsoft.com.cn/article/dpicoso.html