mysql分頁存儲過程
這個要看資料庫來得,
不同的資料庫,
處理機制不一樣。
例如:
要求
查詢
SALE_REPORT
表中,每日銷售金額(SALE_MONEY)合計最大的10條數據,要求按從大到小,取第11條到第20條。
對於
Oracle
資料庫,
一般是用
ROWNUM
來處理。
SELECT
*
FROM
(
SELECT
ROWNUM
AS
NO,
A.SALE_DATE,
A.SUM_MONEY
FROM
(
SELECT
SALE_DATE,
SUM(SALE_MONEY)
AS
SUM_MONEY
FROM
SALE_REPORT
GROUP
BY
SALE_DATE
ORDER
BY
SUM(SALE_MONEY)
DESC
)
A
)
B
WHERE
B.NO
BETWEEN
11
AND
20
對於
SQL
Server
來說,
一般是使用
2個
Top
來處理
SELECT
TOP
10
top20.*
FROM
(
SELECT
TOP
20
SALE_DATE,
SUM(SALE_MONEY)
AS
SUM_MONEY
FROM
SALE_REPORT
GROUP
BY
SALE_DATE
ORDER
BY
SALE_DATE
DESC
)
AS
top20
ORDER
BY
top20.SALE_DATE
ASC
對於
Mysql
來說,
用
Limit
真是
安逸啊
SELECT
SALE_DATE,
SUM(SALE_MONEY)
AS
SUM_MONEY
FROM
SALE_REPORT
GROUP
BY
SALE_DATE
ORDER
BY
SUM(SALE_MONEY)
DESC
LIMIT
11,
10
B. mssql 表,有250萬個記錄,10萬條分一頁,求分頁查詢語句。(注意沒有自增長的id。)
樓上的是在mysql中才能用。mssql分頁還是用存儲過程吧。
CREATE PROC pages
@tblName varchar(255), -- 表名
@strGetFields varchar(1000), -- 需要返回的列
@fldName varchar(255), -- 排序的欄位名
@PageSize int, -- 多少條/頁
@PageIndex int, -- 頁碼
@doCount bit, -- 返回記錄總數, 0不返回,1返回
@OrderType bit, -- 設置排序類型, 0升序,1降序
@strWhere varchar(1500) -- 查詢條件 (注意: 不要加 where)
AS
declare @strSQL varchar(5000) --主語句
declare @strTmp varchar(150) --臨時變數
declare @strOrder varchar(400)--排序類型
--如果@doCount傳遞過來的不是0,就執行總數統計。
if @doCount != 0
begin
--查詢條件為空
set @strSQL = 'select count(*) as Total from ' + @tblName
--查詢條件不為空
if @strWhere !=''
set @strSQL = 'select count(*) as Total from ' + @tblName + ' where '+@strWhere
end
--以下的所有代碼都是@doCount為0的情況:
--如果@OrderType是1,就執行降序,否則為升序!
else
begin
--查詢條件為空
set @strTmp = '>(select max'
set @strOrder = ' order by ' + @fldName +' asc'
--查詢條件不為空
if @OrderType = 1
begin
set @strTmp = '<(select min'
set @strOrder = ' order by ' + @fldName +' desc'
end
--如果是第一頁就執行代碼,這樣會加快執行速度
if @PageIndex = 1
begin
--查詢條件為空
set @strSQL='select top '+str(@PageSize)+' '+@strGetFields+' from '+@tblName+' '+@strOrder
--如果查詢條件不為空,
if @strWhere != ''
set @strSQL='select top '+str(@PageSize)+' '+@strGetFields+' from '+@tblName+' where '+@strWhere+' '+@strOrder
end
--如果不是第一頁,則
else
begin
--以下代碼賦予了@strSQL以真正執行的SQL代碼
--sql查詢語句
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '
+ @tblName + ' where ' + @fldName + '' + @strTmp + '('
+ @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '
+ @fldName + ' from ' + @tblName + '' + @strOrder + ') as tblTmp)'+ @strOrder
--如果查詢條件不為空,則另寫sql語句
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '
+ @tblName + ' where ' + @fldName + '' + @strTmp + '('
+ @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '
+ @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
end
end
exec (@strSQL)
GO
--運行存儲過程pages
--表名varchar,要返回的列名(*為返回所有)varchar,排序的列varchar,每頁顯示數量int,
--第幾頁int,是否統計總數bit,是否降序排列bit,排列條件(不要帶where)varchar
--統計borrow表的記錄數量
exec pages 'uu','*','',0,0,1,0,''
--按borrowid排倒序分別顯示1、2、3頁的信息
exec pages 'uu','*','uid',4,1,0,1,''
exec pages 'uu','*','uid',4,2,0,1,'uid is not null'
exec pages 'uu','*','uid',4,3,0,1,''
C. 多參數(條件)的分頁存儲過程 或 sql 語句
lz不是吧,答案不都有了嗎?你想在加條件
分頁的sql語句sum
每頁顯示的信息條數num
顯示第幾頁select
top
sum
*
from
表名
t
where
t.id
not
in
(select
id
top
(sum
*(num
-1))id
from
表名)
and
t.欄位名
=
「變數」
and
....
D. sql 關於存儲過程
@nowpage是int型的,要轉成字元型,也就類似於改成
set @strsql='select top 20 * from xxx where id not in
(select top '+convert(varchar(10),@nowpage)+' id from xxx where
E. 關於asp.net項目中可以用存儲過程實現高效分頁
不同的資料庫SQL語法會有差異,所以MS SQL的存儲過程不能直接用到別的瀏覽器上。JQuery是客戶端的框架,如果你在JQuery裡面寫分頁的話就需要把所有數據全部傳到客戶端,然後再處理,JQuery本身是解釋性語言,性能上肯定不能和C#等語言相比,如果一次查詢有1百萬條數據,那麼你用JQuery做分頁的話你的電腦基本上是死機了。
F. 如果在資料庫中有大數據量,而我們用分頁存儲過程,怎麼樣才能效率高
--------------------------------
--關於分頁儲存的效率問題
--5個存儲過程都是採用不同的方式
--------------------------------
------------------------------------------
--利用select top 和select not in進行分頁--
------------------------------------------
create procere proc_paged_with_notin --利用select top and select not in
(
@pageIndex int, --頁索引
@pageSize int --每頁記錄數
)
as
begin
set nocount on;
declare @timediff datetime --耗時
declare @sql nvarchar(500)
select @timediff=Getdate()
set @sql='select top '+str(@pageSize)+' * from tb_TestTable where(ID not in(select top '+str(@pageSize*@pageIndex)+' id from tb_TestTable order by ID ASC)) order by ID'
execute(@sql) --因select top後不支技直接接參數,所以寫成了字元串@sql
select datediff(ms,@timediff,GetDate()) as 耗時
set nocount off;
endexec proc_paged_with_notin 10000,10
--------------------------------------
--利用select top 和 select max(列鍵)--
--------------------------------------
create procere proc_paged_with_selectMax --利用select top and select max(列)
(
@pageIndex int, --頁索引
@pageSize int --頁記錄數
)
as
begin
set nocount on;
declare @timediff datetime
declare @sql nvarchar(500)
select @timediff=Getdate()
set @sql='select top '+str(@pageSize)+' * From tb_TestTable where(ID>(select max(id) From (select top '+str(@pageSize*@pageIndex)+' id From tb_TestTable order by ID) as TempTable)) order by ID'
execute(@sql)
select datediff(ms,@timediff,GetDate()) as 耗時
set nocount off;
end--------------------------------------------------------
--利用select top和中間變數--此方法因網上有人說效果最佳--
--------------------------------------------------------
create procere proc_paged_with_Midvar --利用ID>最大ID值和中間變數
(
@pageIndex int,
@pageSize int
)
as
declare @count int
declare @ID int
declare @timediff datetime
declare @sql nvarchar(500)
begin
set nocount on;
select @count=0,@ID=0,@timediff=getdate()
select @count=@count+1,@ID=case when @count<=@pageSize*@pageIndex then ID else @ID end from tb_testTable order by id
set @sql='select top '+str(@pageSize)+' * from tb_testTable where ID>'+str(@ID)
execute(@sql)
select datediff(ms,@timediff,getdate()) as 耗時
set nocount off;
end
---------------------------------------------------------------------------------------
--利用Row_number() 此方法為SQL server 2005中新的方法,利用Row_number()給數據行加上索引--
---------------------------------------------------------------------------------------
create procere proc_paged_with_Rownumber --利用SQL 2005中的Row_number()
(
@pageIndex int,
@pageSize int
)
as
declare @timediff datetime
begin
set nocount on;
select @timediff=getdate()
select * from (select *,Row_number() over(order by ID asc) as IDRank from tb_testTable) as IDWithRowNumber where IDRank>@pageSize*@pageIndex and IDRank<@pageSize*(@pageIndex+1)
select datediff(ms,@timediff,getdate()) as 耗時
set nocount off;
end
--------------------------
--利用臨時表及Row_number--
--------------------------
create procere proc_CTE --利用臨時表及Row_number
(
@pageIndex int, --頁索引
@pageSize int --頁記錄數
)
as
set nocount on;
declare @ctestr nvarchar(400)
declare @strSql nvarchar(400)
declare @datediff datetime
begin
select @datediff=GetDate()
set @ctestr='with Table_CTE as
(select ceiling((Row_number() over(order by ID ASC))/'+str(@pageSize)+') as page_num,* from tb_TestTable)';
set @strSql=@ctestr+' select * From Table_CTE where page_num='+str(@pageIndex)
end
begin
execute sp_executesql @strSql
select datediff(ms,@datediff,GetDate())
set nocount off;
end
我們分別在每頁10條數據的情況下在第2頁,第1000頁,第10000頁,第100000頁,第199999頁進行測試,耗時單位:ms 每頁測試5次取其平均值 存過第2頁耗時第1000頁耗時第10000頁耗時第100000頁耗時第199999頁耗時效率排行1用not in0ms16ms47ms475ms953ms32用select max5ms16ms35ms325ms623ms13中間變數_number0ms0ms34ms365ms710ms24臨時表780ms796ms798ms780ms805ms4正好我正在研究這個問題 給大家分享
G. 高分求mysql 高效分頁存儲過程(500W級),千分以內任取。不要百度文庫的,效率太差。
CREATE PROCEDURE pageTest --用於翻頁的測試
--需要把排序欄位放在第一列
(
@FirstID nvarchar(20)=null, --當前頁面里的第一條記錄的排序欄位的值
@LastID nvarchar(20)=null, --當前頁面里的最後一條記錄的排序欄位的值
@isNext bit=null, --true 1 :下一頁;false 0:上一頁
@allCount int output, --返回總記錄數
@pageSize int output, --返回一頁的記錄數
@CurPage int --頁號(第幾頁)0:第一頁;-1最後一頁。
)
AS
if @CurPage=0
begin
--統計總記錄數
select @allCount=count(ProctId) from Proct_test
set @pageSize=10
--返回第一頁的數據
select top 10
ProctId,
ProctName,
Introction
from Proct_test order by ProctId
end
else if @CurPage=-1
select * from
(select top 10 ProctId,
ProctName,
Introction
from Proct_test order by ProctId desc ) as aa
order by ProctId
else
begin
if @isNext=1
--翻到下一頁
select top 10 ProctId,
ProctName,
Introction
from Proct_test where ProctId > @LastID order by ProctId
else
--翻到上一頁
select * from
(select top 10 ProctId,
ProctName,
Introction
from Proct_test where ProctId < @FirstID order by ProctId desc) as bb order by ProctId
end
千萬數據翻頁就像100條數據一樣!