《Mysql實(shí)例mysql5分頁查詢深入探討》要點(diǎn):
本文介紹了Mysql實(shí)例mysql5分頁查詢深入探討,希望對您有用。如果有疑問,可以聯(lián)系我們。
依照分頁狀態(tài)劃分,mysql5支持動態(tài)分頁和靜態(tài)分頁.MYSQL數(shù)據(jù)庫
依照分頁對象劃分,mysql5支持sql分頁和存儲過程分頁.MYSQL數(shù)據(jù)庫
mysql5分頁的基本原理是依靠limit字句來對查詢分頁.MYSQL數(shù)據(jù)庫
mysql5的limit語句不支持表達(dá)式,只支持確定的整數(shù)值或者預(yù)定義參數(shù).這是一個(gè)大陷阱!也是mysql最為變態(tài)的一個(gè)特征了,讓我迷茫了很長時(shí)間才知道.不過db2、oracle等數(shù)據(jù)庫分頁參數(shù)都支持表達(dá)式.也是本文中的一個(gè)焦點(diǎn)問題.MYSQL數(shù)據(jù)庫
mysql5的語句的基本格式是在select語句最后添加一個(gè)返回記錄的限制數(shù),有兩個(gè)參數(shù)(取值范圍均大于等于0),分別用來限制返回記錄的起起始位置和返回記錄的數(shù)量,.但是不包含起始位置的記錄,例如,select * from tab limit 1,3; 則指揮顯示第2、3、4三條記錄,第1條記錄不會被返回,如果要返回則應(yīng)該從0開始.MYSQL數(shù)據(jù)庫
mysql5的分MYSQL數(shù)據(jù)庫
下面從分頁對象的角度研究mysql5的分頁實(shí)現(xiàn),分為sql分頁和存儲過程分頁.其中sql分頁分為兩種類型,一種是靜態(tài)的,一種是動態(tài)的.而存儲過程下只討論動態(tài)的,靜態(tài)的沒有意義.MYSQL數(shù)據(jù)庫
?環(huán)境:MYSQL數(shù)據(jù)庫
windows xp professional 簡體中文版MYSQL數(shù)據(jù)庫
mysql-5.0.45-win32MYSQL數(shù)據(jù)庫
?開發(fā)工具:MYSQL數(shù)據(jù)庫
sql manager 2007 for mysqlMYSQL數(shù)據(jù)庫
sqlyog enterprise 6.05MYSQL數(shù)據(jù)庫
?測試腳本:MYSQL數(shù)據(jù)庫
一個(gè)表,參看[url]http://img1.51cto.com/attachment/200708/62575_1188540717.txt[/url],打開后,里面有db2、mysql兩種數(shù)據(jù)庫腳本,執(zhí)行mysql的.MYSQL數(shù)據(jù)庫
?一、sql分頁MYSQL數(shù)據(jù)庫
?1、靜態(tài)分頁MYSQL數(shù)據(jù)庫
?select xh,mldm,mlmc from dm_hy_cy limit 2,3;MYSQL數(shù)據(jù)庫
?執(zhí)行結(jié)果:MYSQL數(shù)據(jù)庫
+----+------+------------------------------+MYSQL數(shù)據(jù)庫
| xh | mldm | mlmc???????????????????????? |MYSQL數(shù)據(jù)庫
+----+------+------------------------------+MYSQL數(shù)據(jù)庫
|? 3 | c??? | 制造業(yè)?????????????????????? |MYSQL數(shù)據(jù)庫
|? 4 | d??? | 電力、燃?xì)饧八纳a(chǎn)和供應(yīng)業(yè) |MYSQL數(shù)據(jù)庫
|? 5 | e??? | 建筑業(yè)?????????????????????? |MYSQL數(shù)據(jù)庫
+----+------+------------------------------+MYSQL數(shù)據(jù)庫
?截圖如下:MYSQL數(shù)據(jù)庫
MYSQL數(shù)據(jù)庫
??2、動態(tài)分頁MYSQL數(shù)據(jù)庫
?prepare stmt1 from 'select xh,mldm,mlmc from dm_hy_cy limit ?,?';MYSQL數(shù)據(jù)庫
set @start=2;MYSQL數(shù)據(jù)庫
set @size=3;MYSQL數(shù)據(jù)庫
execute stmt1 using @start,@size;MYSQL數(shù)據(jù)庫
?說明:MYSQL數(shù)據(jù)庫
?預(yù)制語句的sql語法基于三個(gè)sql語句:MYSQL數(shù)據(jù)庫
?prepare stmt_name from preparable_stmt;MYSQL數(shù)據(jù)庫
stmt_name 是預(yù)處理語句的標(biāo)識,是一個(gè)將要執(zhí)行的sql語句.里面如果有參數(shù),則用“?”替換,“?”在這里也叫占位符.類似jdbc預(yù)處理sql語句.MYSQL數(shù)據(jù)庫
?execute stmt_name [using @var_name [, @var_name] ...];MYSQL數(shù)據(jù)庫
執(zhí)行一個(gè)預(yù)處理語句stmt_nameusing表示使用了動態(tài)變量(變量名前有“@”標(biāo)識符),@var_name [, @var_name] ... 是參數(shù)列表,按順序賦值給預(yù)處理sql中的(占位)參數(shù).MYSQL數(shù)據(jù)庫
?{deallocate | drop} prepare stmt_name;MYSQL數(shù)據(jù)庫
刪除或者分配存儲單元給預(yù)處理語句.MYSQL數(shù)據(jù)庫
?說明:在mysql5中,可以使用動態(tài)變量,動態(tài)變量的類型是不確定的,可以多次賦不同類型的值,動態(tài)變量的類型取決于其值的具體類型.動態(tài)變量定義的定義和使用就像隨地大小便一樣,有需要就當(dāng)即辦理.定義的方式也很簡單:set @var_name=...,在定義的時(shí)候就給定了值.MYSQL數(shù)據(jù)庫
?執(zhí)行結(jié)果和1一樣,截圖如下:MYSQL數(shù)據(jù)庫
MYSQL數(shù)據(jù)庫
?二、存儲過程分頁MYSQL數(shù)據(jù)庫
?-- 設(shè)定語句定界符為 $$MYSQL數(shù)據(jù)庫
delimiter $$MYSQL數(shù)據(jù)庫
-- 預(yù)防性刪除存儲過程MYSQL數(shù)據(jù)庫
drop procedure if exists testdb.sp_pagination$$MYSQL數(shù)據(jù)庫
?-- 聲明創(chuàng)建存儲過程MYSQL數(shù)據(jù)庫
create procedure sp_pagination(in in_start integer(11), in in_size integer(11))MYSQL數(shù)據(jù)庫
-- ------------------------------------------MYSQL數(shù)據(jù)庫
-- 說明:mysql5存儲過程分頁MYSQL數(shù)據(jù)庫
-- 語言:mysqlMYSQL數(shù)據(jù)庫
-- 作者:熔 巖MYSQL數(shù)據(jù)庫
-- 日期:2007-9-1MYSQL數(shù)據(jù)庫
-- ------------------------------------------MYSQL數(shù)據(jù)庫
beginMYSQL數(shù)據(jù)庫
?-- 定義兩個(gè)動態(tài)變量,接收存儲過程中的分頁參數(shù)MYSQL數(shù)據(jù)庫
set @start=in_start;MYSQL數(shù)據(jù)庫
set @size=in_size;MYSQL數(shù)據(jù)庫
?-- 定義預(yù)處理sql查詢語句MYSQL數(shù)據(jù)庫
prepare stmt from 'select mldm,mlmc from dm_hy_cy limit ?,?';MYSQL數(shù)據(jù)庫
?-- 執(zhí)行預(yù)處理語句,并用動態(tài)變量替換參數(shù)占位符MYSQL數(shù)據(jù)庫
execute stmt using @start,@size;MYSQL數(shù)據(jù)庫
?endMYSQL數(shù)據(jù)庫
-- 存儲過程聲明結(jié)束MYSQL數(shù)據(jù)庫
$$MYSQL數(shù)據(jù)庫
-- 設(shè)定語句定界符為 “;”,以保證后來的以分號結(jié)尾的sql正常執(zhí)行MYSQL數(shù)據(jù)庫
delimiter ;MYSQL數(shù)據(jù)庫
?存儲過程部署截圖:MYSQL數(shù)據(jù)庫
MYSQL數(shù)據(jù)庫
?存儲過程定義好了后編譯以下.MYSQL數(shù)據(jù)庫
然后用命令執(zhí)行:MYSQL數(shù)據(jù)庫
call sp_pagination(2,3);MYSQL數(shù)據(jù)庫
返回結(jié)果如下:MYSQL數(shù)據(jù)庫
MYSQL數(shù)據(jù)庫
?反面教材:如果不使用預(yù)處理sql,不管你怎么搞,這個(gè)動態(tài)根據(jù)傳遞參數(shù)分頁都是無法實(shí)現(xiàn)的(至少目前我這個(gè)環(huán)境下如此,如果你有興趣可以挑戰(zhàn)一下看看).MYSQL數(shù)據(jù)庫
?下面我就給出我剛開始用db2的經(jīng)驗(yàn)實(shí)現(xiàn)mysql5存儲過程分頁的例子,結(jié)果當(dāng)然是失敗了.現(xiàn)在給出來,大家看看:MYSQL數(shù)據(jù)庫
?delimiter $$MYSQL數(shù)據(jù)庫
drop procedure if exists testdb.sp_pagination$$MYSQL數(shù)據(jù)庫
create procedure sp_pagination(in in_start integer(11), in in_size integer(11))MYSQL數(shù)據(jù)庫
-- ------------------------------------------MYSQL數(shù)據(jù)庫
-- 說明:反面教材,切勿模仿!mysql5存儲過程分頁MYSQL數(shù)據(jù)庫
-- 語言:mysqlMYSQL數(shù)據(jù)庫
-- 作者:熔 巖MYSQL數(shù)據(jù)庫
-- 日期:2007-9-1MYSQL數(shù)據(jù)庫
-- ------------------------------------------MYSQL數(shù)據(jù)庫
beginMYSQL數(shù)據(jù)庫
?-- 直接利用調(diào)用參數(shù)在limit子句中用MYSQL數(shù)據(jù)庫
select mldm,mlmc from dm_hy_cy limit in_start,in_size;MYSQL數(shù)據(jù)庫
?endMYSQL數(shù)據(jù)庫
$$MYSQL數(shù)據(jù)庫
delimiter ;MYSQL數(shù)據(jù)庫
總結(jié):mysql5存儲過程分頁目前我所知道就這幾種,也許mysql會在將來新版本中支持limit的表達(dá)式參數(shù),但眼前的是要辦理問題.希望這篇文章能對您mysql過程分頁提供一種辦理方案,節(jié)省摸索研究的時(shí)間.MYSQL數(shù)據(jù)庫
歡迎參與《Mysql實(shí)例mysql5分頁查詢深入探討》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/11569.html