在實際開發的過程中如果記錄數非常的龐大,如果直接用sql語句查詢並填充到datatable中,將是一件非常恐怖的事情。而且對**效能,伺服器效能消耗很大。
兩個常犯的錯誤:
1)在現實資料時,查詢時會將所有的滿足條件的資料全部填充到datatable中,然後在程式中根據條件顯示其中的一部分資料。
2)在統計資料時,在獲取符合條件的記錄條數時也是通過將所有滿足條件的資料全部填充到datatable中,然後通過datatable例項rows.count屬性來獲取記錄條數。
這樣做的結果就是效率極低,如果資料量太大,可能造成自己需要的資料長久的無法顯示,所以顯示資料是應該使用分頁查詢。分頁查詢就是每次只返回所需要的資料,而不用每次都從資料庫中把資料全部提出來,這樣可以降低程式與資料庫之間的資料傳送量,並且還可以提高程式的效能。
一般來說,在資料量大的情況下要分頁顯示,這樣決定返回的查詢結果集的引數有兩個:當前顯示的頁數pageindex和每頁顯示的記錄條數size。
所使用的資料表如下圖:表中的id是主鍵。
下面我們按照id正序排列查詢所有人的資訊,sql語句如下:
view code
現在我們對資料進行分頁,分頁規則就是,頁容量5條資料,那麼我們完成第1頁的資料查詢可以使用sql語句是:
view code
這樣我們就可以取出第1頁所要顯示的5條資料。但是我們應該怎麼樣編寫sql語句才可以顯示第2,3,4......頁的資料呢?
如果說我們第1頁取出的資料時第1-5條記錄,那麼第2頁的資料就應該是6-10的記錄。我們應該怎麼做到呢?有兩種方法:第一種就是一次性的將所有的資料都提取出填充到datatable中,然後在for迴圈中通過i從5開始,並且i小於10這種方法顯示資料,這種方法的缺點前面已經介紹。第二種方法就是在資料庫中對資料進行過濾,這個時候sql語句中的 not in 就可以很好地排上用場。
那麼怎麼使用not in將第2頁的資料顯示出來呢,sql語句如下:
在這裡使用了乙個子查詢先將第1頁的資料編號顯示出來,然後使用not in 將1-5的記錄從資料中排出,顯示的就是6-10 的資料記錄。
因為資料id是從1開始,所以id為1-5的記錄顯示在第1頁,id為6-10的記錄在第2頁顯示,id為11-15的記錄在第3頁顯示,依此類推第n頁的資料的sql語句是:n為定義顯示資料的第幾頁,
1 select top 5 * from t_person where id not in這樣就可以根據引數n顯示第幾頁的資料。2 (3 select top (n-1)5 id from t_person order by id asc
4 )order by id asc;
還有乙個比較重要的知識點就是如何計算資料頁分頁的總數,如果現在有20條資料,如果每頁5條資料,很明顯就是分4頁。但是如果記錄數是21條,這個時候很明顯應該分5頁。有乙個公式,假如總共有m條資料,每頁顯示n條資料(m,n都大於0),那麼需要顯示所有記錄的頁數page為:page=(m%n)==0?(m/n):(m/n+1);
第二種分頁的方法:
這裡需要使用sql中的row_number函式,該函式的作用就是在返回的記錄集合內為每一條記錄標上順序編號。
因為我們要對資料庫進行刪除操作的話,資料庫表中的id的值可能是不連續的。因為在上面的方法中,我們主要是使用id來排序,不需要太多的操作,但是下面的方法,就需要有乙個連續的id值來查詢資料。
先看乙個sql語句:
1 select * from這樣的話,我們仍然能夠按照要求取出相應頁數的資料。我們只需要稍微改變一下,sql語句如下:n為顯示資料的頁碼2 (3 select * from t_person
4 )as a
5 where id>5 and id<=10
1 select * from這個時候我們就可以根據引數n來選出相應頁數的資料,但是我們可以很快的發現,這個分頁對id的連續有很大的依賴性,所以,我們在對資料進行刪除操作的時候,資料庫中的id很可能是不連續的,所以在資料庫中進行分頁的時候,就需要對資料進行編號,這個時候就要使用sql中的row_number函式,2 (3 select * from t_person
4 )as a
5 where id>(n-1)*5 and id<=n*5
使用row_number函式查詢的sql語句和顯示結果如下:
很容易的我們發現在id的前面有了乙個按照id正序排列的rl的列。
所以,完整的 sql分頁語句為:n為我們傳入的分頁的頁碼,預設的每頁顯示的資料位5條
1 select * from這樣,我們就可以建立相應的分頁儲存過程,在資料庫中對資料進行分頁,然後供程式進行呼叫。2 (3 select * from t_person
4 )as a
5 where id>(n-1)*5 and id<=n*5
最後分享乙個,在網上看到的乙個比較好的分頁儲存過程:
1 create procedure getpagedata2 (3 @tablename varchar(30),--表名稱
4 @idname varchar(20),--表主鍵名稱
5 @pageindex int,--當前頁數
6 @pagesize int--每頁大小
7 )8 as
9 if @pageindex > 0
10 begin
11 set nocount on
12 declare @pagelowerbound int,@startid int,@sql nvarchar(225)
13 set @pagelowerbound = @pagesize * (@pageindex-1)
14 if @pagelowerbound<1
15 set @pagelowerbound=1
16 set rowcount @pagelowerbound
17 set @sql=n'select @startid = ['+@idname+'] from '+@tablename+' order by '+@idname
18 exec sp_executesql @sql,n'@startid int output',@startid output
19 set rowcount 0
20 set @sql='select top '+str(@pagesize) +' * from '+@tablename+' where ['+@idname+']>='+ str(@startid) +' order by ['+@idname+'] '
21 exec(@sql)
22 set nocount off
23 end
幾種分頁總結
id連續 select from cardinfo where id 10 and id 20 查詢11 20條資料 查出來結果是12 21 id不連續 外層查詢沒有對錶a查詢,效率大有提高 select top 10 from select top 20 from cardinfo order b...
查詢分頁的幾種Sql寫法
1.概述 在網頁中如果顯示的資料太多就會佔據過多的頁面,而且顯示速度也會很慢。為了控制每次在頁面上顯示資料的數量,就可以利用分頁來顯示資料。2.技術要點 select top pagesize from table where id not in select top prenum id from ...
SQL 分頁查詢的幾種方式
最近維護乙個老專案,專案需要分頁取資料,之前很久都用ef框架開發,突然要用sql分頁有點茫然,於是總結了一些sql server sql分頁的思路,以便加深記憶。一 用top排序的方式 1 declare pagesize int 202 declare pageindex int 23 4sele...