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