如何用sql語句 實現分頁查詢
方法1:
適用于 SQL Server 2000/2005
SELECT TOP 頁大小 *
FROM table1
WHERE id NOT IN
(
SELECT TOP 頁大小*(頁數-1) id FROM table1 ORDER BY id
)
ORDER BY id
方法2:
適用于 SQL Server 2000/2005
SELECT TOP 頁大小 *
FROM table1
WHERE id >
(
SELECT ISNULL(MAX(id),0)
FROM
(
SELECT TOP 頁大小*(頁數-1) id FROM table1 ORDER BY id
) A
)
ORDER BY id
方法3:
適用于 SQL Server 2005
SELECT TOP 頁大小 *
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
) A
WHERE RowNumber >頁大小*(頁數-1)
如何使用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 studentwherestu_id in( select stu_id from( select ROW_NUMBER() over (order by stu_id desc) as Row, stu_id from student )students where *>(@PageIndex-1)*@PageSize And *<=@PageIndex*@PageSize) 其中變量@PageIndex、@PageSize是兩個變量或者參數。
求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,ba就是從第幾條開始 b就是查詢出的條數例如 從第10條開始后的10條select * from NEWS limit 10,10從第6條開始后的8條select * from NEWS limit 6,8。
對sqlserver 語句進行分頁
declare @iPage int --所取的頁的序數 (第幾頁)
declare @iPageNum int --所取的數據行數(除最后一頁外,每頁所取的行數應該都是一樣的)
declare @iRecordNumber int --取@iPage頁時,結尾記錄所在行數
declare @iRecordCount int --總記錄行數
--變量初始化
set @iPage=1 --可用參數傳遞
set @iPageNum=10 --默認每頁取10行
set @iRecordNumber=@iPage*@iPageNum
select @iRecordCount=count(cirDeId) from (select cirDeId from CircleDetails group by cirDeId) a
--取最后一頁時,重算結尾所在行數(@iRecordNumber)、所取記錄數(@iPageNum)
if @iRecordNumber>@iRecordCount
begin
set @iRecordNumber=@iRecordCount
if (@iRecordNumber%@iPageNum)>0
set @iPageNum=@iRecordNumber%@iPageNum
end
select * from (
select top @iPageNum * from(
select top @iRecordNumber cirDeId,
(select count(1) from CirclePost where *d = *d_cp) circlepostcount
,(select count(1) from CircleAttention where *d = *d_ca) circleattentioncount
from CircleDetails group by cirDeId order by 3 desc,2 desc
) order by 3,2
) order by 3 desc,2 desc
SQL數據庫分頁原理
要想分頁,首先得做好準備工作。
你要先聲明每頁顯示多少條數據,還得獲取當前選擇的是多少頁的頁碼。有了這兩個分頁就好辦了。
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語句,分頁就很好做了。
sqlsever 2000 分頁語句
CREATE PROCEDURE P_Page( @pageNo INT=1, @pageSize INT=10)ASDECLARE @s NVARCHAR(2000)SET @s='SELECT top '+RTRIM(@pageSize)+'* FROM enterprise WHERE ID not in(select top '+RTRIM((@pageNo-1)*@pageSize)+' from enterprise)'EXEC (@s)go可用存儲過程,如以上ID為表唯一列時可調用SQL2000可用鄒建寫法,最高效的寫法還是針對性的寫樓主換SQL2005以上版本可用row_Number實現更簡單/*--用存儲過程實現的分頁程序 顯示指定表、視圖、查詢結果的第X頁 對于表中主鍵或標識列的情況,直接從原表取數查詢,其它情況使用臨時表的方法 如果視圖或查詢結果中有主鍵,不推薦此方法--鄒建 2003.09(引用請保留此信息)--*//*--調用示例 exec p_show '地區資料' exec p_show '地區資料',5,3,'地區編號,地區名稱,助記碼','地區編號'--*/if exists (select * from *ects where id = object_id(N'[dbo].[p_show]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)drop procedure [dbo].[p_show]GOCREATE Proc p_show@QueryStr nvarchar(4000), --表名、視圖名、查詢語句@PageSize int=10, --每頁的大小(行數)@PageCurrent int=1, --要顯示的頁@FdShow nvarchar (4000)='', --要顯示的字段列表,如果查詢結果有標識字段,需要指定此值,且不包含標識字段@FdOrder nvarchar (1000)='' --排序字段列表asdeclare @FdName nvarchar(250) --表中的主鍵或表、臨時表中的標識列名 ,@Id1 varchar(20),@Id2 varchar(20) --開始和結束的記錄號 ,@Obj_ID int --對象ID--表中有復合主鍵的處理declare @strfd nvarchar(2000) --復合主鍵列表 ,@strjoin nvarchar(4000) --連接字段 ,@strwhere nvarchar(2000) --查詢條件select @Obj_ID=object_id(@QueryStr) ,@FdShow=case isnull(@FdShow,'') when '' then ' *' else ' '+@FdShow end ,@FdOrder=case isnull(@FdOrder,'') when '' then '' else ' order by '+@FdOrder end ,@QueryStr=case when @Obj_ID is not null then ' '+@QueryStr else ' ('+@QueryStr+') a' end--如果顯示第一頁,可以直接用top來完成if @PageCurrent=1 begin select @Id1=cast(@PageSize as varchar(20)) exec('select top '+@Id1+@FdShow+' from '+@QueryStr+@FdOrder) returnend--如果是表,則檢查表中是否有標識更或主鍵if @Obj_ID is not null and objectproperty(@Obj_ID,'IsTable')=1begin select @Id1=cast(@PageSize as varchar(20)) ,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20)) select @FdName=name from syscolumns where id=@Obj_ID and status=0x80 if @@rowcount=0 --如果表中無標識列,則檢查表中是否有主鍵 begin if not exists(select 1 from sysobjects where parent_obj=@Obj_ID and xtype='PK') goto lbusetemp --如果表中無主鍵,則用臨時表處理 select @FdName=name from syscolumns where id=@Obj_ID and colid in( select colid from sysindexkeys where @Obj_ID=id and indid in( select indid from sysindexes where @Obj_ID=id and name in( select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID ))) if @@rowcount>1 --檢查表中的主鍵是否為復合主鍵 begin select @strfd='',@strjoin='',@strwhere='' select @strfd=@strfd+',['+name+']' ,@strjoin=@strjoin+' and a.['+name+']=b.['+name+']' ,@strwhere=@strwhere+' and b.['+name+'] is null' from syscolumns where id=@Obj_ID and colid in( select colid from sysindexkeys where @Obj_ID=id and indid in( select indid from sysindexes where @Obj_ID=id and name in( select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID ))) select @strfd=substring(@strfd,2,2000) ,@strjoin=substring(@strjoin,5,4000) ,@strwhere=substring(@strwhere,5,4000) goto lbusepk end endendelse goto lbusetemp/*--使用標識列或主鍵為單一字段的處理方法--*/lbuseidentity: exec('select top '+@Id1+@FdShow+' from '+@QueryStr +' where '+@FdName+' not in(select top ' +@Id2+' '+@FdName+' from '+@QueryStr+@FdOrder +')'+@FdOrder ) return/*--表中有復合主鍵的處理方法--*/lbusepk: exec('select '+@FdShow+' from(select top '+@Id1+' a.* from (select top 100 percent * from '+@QueryStr+@FdOrder+') a left join (select top '+@Id2+' '+@strfd+' from '+@QueryStr+@FdOrder+') b on '+@strjoin+' where '+@strwhere+') a' ) return/*--用臨時表處理的方法--*/lbusetemp: select @FdName='[ID_'+cast(newid() as varchar(40))+']' ,@Id1=cast(@PageSize*(@PageCurrent-1) as varchar(20)) ,@Id2=cast(@PageSize*@PageCurrent-1 as varchar(20))exec('select '+@FdName+'=identity(int,0,1),'+@FdShow+' into #tb from'+@QueryStr+@FdOrder+' select '+@FdShow+' from #tb where '+@FdName+' between ' +@Id1+' and '+@Id2 )GO。