樓主,剛剛有個問友和你問的差不多,我剛回答了他的。就直接把剛回答的復制給你看看啦。希望對你有幫助、。
要想分頁,首先得做好准備工作。你要先聲明每頁顯示多少條數據,還得獲取當前選擇的是多少頁的頁碼。有了這兩個分頁就好辦了。
sql如下:select top 10 from tableName
where (id not in(select top 20 from tableName order by Id desc)) order by Id desc
分頁需要使用到的一些動態數據如下:
每頁顯示的數量:自己定義。
總頁數:數據總條數/每頁顯示的條數
當前頁碼的計算方法:(頁碼-1)*每頁顯示的數量。比如我要瀏覽第3頁的數據,3從客戶端傳送過來後,在後台對頁碼進行處理:(3-1)*每頁顯示的數量(假如是10).算出來後的結果就是20.你在把20以參數注入的方式動態添加到上面那個20那裡就ok了。
sql中的10表示你每頁顯示的數據,這里跟10,就代表每頁顯示10條。(你可以定義一個常量作為每頁顯示的條數)
where中的20表示不包括前面的20條數據,也就是查詢出從第21條到30之間的數據。
不知道我這樣說你是否理解,其實只要理解了sql語句,分頁就很好做了。
② SQL分頁的幾種方法
方法一 使用offset fetch next(2012版本及以上版本才可以使用)
方法二 使用row_number()函數
利用row_number() over(order by id desc)函數計算出行數,選定相應的行數返回即可(2005版本以上才可以使用)
使用存儲過程封裝
③ SQl分頁語句
DECLARE @pagesize INT --每頁記錄條數
declare @pageindex INT --頁索引
SET @pagesize=5
SET @pageindex=3
DECLARE @sql VARCHAR(800) --拼接主查詢語句 top法
set @sql='SELECT TOP '+Cast(@pagesize AS varchar)+'*
FROM #table WHERE id NOT IN
(SELECT TOP '+CAST(((@pageindex-1)*@pagesize) AS VARCHAR) +' id FROM #table)'
PRINT @sql
EXEC (@sql)
④ 幾種常見SQL分頁方式
createtablepagetest
(
idintidentity(1,1)notnull,
col01intnull,
col02nvarchar(50)null,
col03datetimenull
)
--分頁1,notin/top
selecttop50*frompagetest
whereidnotin()
orderbyid
--分頁2,notexists
selecttop50*frompagetest
wherenotexists
(select1from()awherea.id=pagetest.id)
orderbyid
--寫法3,max/top
selecttop50*frompagetest
whereid>(selectmax(id)from()a)
orderbyid
--分頁4,row_number()
selecttop50*from
(selectrow_number()over(orderbyid)rownumber,*frompagetest)a
whererownumber>9900
select*from
(selectrow_number()over(orderbyid)rownumber,*frompagetest)a
whererownumber>9900andrownumber<9951
select*from
(selectrow_number()over(orderbyid)rownumber,*frompagetest)a
--分頁5,在csdn上一帖子看到的,row_number()變體,不基於已有欄位產生記錄序號,先按條件篩選以及排好序,再在結果集上給一常量列用於產生記錄序號
select*
from(
selectrow_number()over(orderbytempColumn)rownumber,*
from(selecttop9950tempColumn=0,*frompagetestwhere1=1orderbyid)a
)b
whererownumber>9900
結論:
1.max/top,ROW_NUMBER()都是比較不錯的分頁方法。相比ROW_NUMBER()只支持sql2005及以上版本,max/top有更好的可移植性,能同時適用於sql2000,access。
2.not exists感覺是要比not in效率高一點點。
3.ROW_NUMBER()的3種不同寫法效率看起來差不多。
4.ROW_NUMBER() 的變體基於這個測試效率實在不好。
⑤ SQL的幾種分頁演算法
利用SQL語句分頁要看你用的什麼資料庫。
Oracle資料庫可以使用ROWNUM或row_number(),例如:Select * from (select ROWNUM rn, t.* from table t) where rn between 11 and 20;
Select * from (select row_number() over (ORDER BY col1) rn, t.* from table t) where rn between 11 and 20;
SQLServer資料庫可以用Top或者row_number()函數,道理同上。
利用SQL分頁有局限性,就是針對不同的資料庫有不同的寫法,所以通常會在應用程序裡面做分頁通用性比較強。但是對於數據量非常龐大的應用來說,還是用SQL分頁比較適合。
⑥ sql語句分頁詳解
這就是一個簡單的查詢語句,一個語句分為select 與 from 之間的部分,from 與 where之間的部分 和where 後邊條件部分。
from 後跟的是表,
你說的a,b就是表名。只不過 是把(select top 20 主鍵欄位,排序欄位 from 表名 order by 排序欄位 desc)查詢的結果作為表a了。
⑦ 求SQL分頁的語句
2個參數Start end
start 開始 end 結束
例如第二頁從Start11條開始 結束end 21百
select * from (select rownum a,NEWS.* from NEWS where rownum<='"+end+"') b where b.a>'"+start+"'"
方法2 select * from NEWS limit a,b
a就是從第幾條開始 b就是查詢出的條數
例如 從第10條開始後的10條select * from NEWS limit 10,10
從第6條開始後的8條select * from NEWS limit 6,8
⑧ SQL Server 分頁 查詢語句
四種方式實現SQLServer 分頁查詢
SQLServer 的數據分頁:
假設現在有這樣的一張表:
CREATE TABLE test
(
id int primary key not null identity,
names varchar(20)
)
然後向裡面插入大約1000條數據,進行分頁測試
假設頁數是10,現在要拿出第5頁的內容,查詢語句如下:
--10代表分頁的大小
select top 10 *
from test
where id not in
(
--40是這么計算出來的:10*(5-1)
select top 40 id from test order by id
)
order by id
原理:需要拿出資料庫的第5頁,就是40-50條記錄。首先拿出資料庫中的前40條記錄的id值,然後再拿出剩餘部分的前10條元素
第二種方法:
還是以上面的結果為例,採用另外的一種方法
--數據的意思和上面提及的一樣
select top 10 *
from test
where id >
(
select isnull(max(id),0)
from
(
select top 40 id from test order by id
) A
)
order by id
原理:先查詢前40條記錄,然後獲得其最id值,如果id值為null的,那麼就返回0
然後查詢id值大於前40條記錄的最大id值的記錄。
這個查詢有一個條件,就是id必須是int類型的。
第三種方法:
select top 10 *
from
(
select row_number() over(order by id) as rownumber,* from test
) A
where rownumber > 40
原理:先把表中的所有數據都按照一個rowNumber進行排序,然後查詢rownuber大於40的前十條記錄
這種方法和oracle中的一種分頁方式類似,不過只支持2005版本以上的
第四種:
存儲過程查詢
創建存儲過程
alter procere pageDemo
@pageSize int,
@page int
AS
declare @temp int
set @temp=@pageSize*(@page - 1)
begin
select top (select @pageSize) * from test where id not in (select top (select @temp) id from test) order by id
end
執行存儲過程
exec 10,5
⑨ 幾種常見SQL分頁方式效率比較,一帖子
sqlserver分頁 第一種分頁方法 需用到的參數: pageSize 每頁顯示多少條數據 pageNumber 頁數 從客戶端傳來 totalRecouds 表中的總記錄數 select count (*) from 表名 totalPages 總頁數 totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1 pages 計算前pages 條數據 pages= pageSize*(pageNumber-1) SQL語句: select top pageSize * from 表名 where id not in (select top pages id from 表名 order by id) order by id 第二種分頁方法 pageSize 每頁顯示多少條數據 pageNumber 頁數 從客戶端傳來 pages=pageSize*(pageNumber-1)+1 select top pageSize * from 表名 where id>=(select max(id) from (select top pages id from 表名 order by id asc ) t ) mysql分頁 需用到的參數: pageSize 每頁顯示多少條數據 pageNumber 頁數 從客戶端傳來 totalRecouds 表中的總記錄數 select count (*) from 表名 totalPages 總頁數 totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1 pages 起始位置 pages= pageSize*(pageNumber-1) SQL語句: select * from 表名 limit pages, pageSize; mysql 分頁依賴於關鍵字 limit 它需兩個參數:起始位置和pageSize 起始位置=頁大小*(頁數-1) 起始位置=pageSize*(pageNumber -1) oracle分頁 pageSize 每頁顯示多少條數據 pageNumber 頁數 從客戶端傳來 totalRecouds 表中的總記錄數 select count (*) from 表名 totalPages 總頁數 totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1 startPage 起始位置 startPage= pageSize*(pageNumber-1)+1 endPage=startPage+pageSize SQL語句 select a.* from ( select rownum num ,t.* from 表名 t where 某列=某值 order by id asc )a where a.num>=startPage and a.num<endPage db2分頁 int startPage=1 //起始頁 int endPage; //終止頁 int pageSize=5; //頁大小 int pageNumber=1 //請求頁 startPage=(pageNumber-1)*pageSize+1 endPage=(startPage+pageSize); SQL語句 select * from (select 欄位1,欄位2,欄位3,欄位4,欄位5,rownumber() over(order by 排序欄位 asc ) as rowid from 表名 )as a where a.rowid >= startPage AND a.rowid <endPage access分頁 pageSize 每頁顯示多少條數據 pageNumber 頁數 從客戶端傳來 pages=pageSize*(pageNumber-1)+1 SQL語句 select top pageSize * from 表名 where id>=(select max(id) from (select top pages id from 表名 order by id asc ) t )
⑩ sql 分頁
SELECTTOP10*
FROM(SELECT*
FROM(selects.PositionNameassName,
h.MonValueasmonValue,
ROW_NUMBER()OVER(ORDERBYs.PositionNameASC)ASRNUM
fromHourSourceh
LEFTJOINPollutantponp.PollutantCode=h.PollutantCode
LEFTJOINStationsons.StationCode=h.StationCode
whereh.TimePointBETWEEN'2015-01-0111:00'and
'2015-01-0112:00'
ands.stationIdin(1,2))bbPIVOT(MAX(monvalue)FORpNamein(O3,CO,PM10))ASpvt)A
WHEREA.RNUM>0andA.rnum<10
sqlserver 資料庫?