MySQL是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB 公司開發(fā)针姿,目前屬于 Oracle 旗下產(chǎn)品乒省。MySQL 最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在 WEB 應(yīng)用方面MySQL是最好的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫管理系統(tǒng)) 應(yīng)用軟件之一兜粘。
MySQL是一種關(guān)聯(lián)數(shù)據(jù)庫管理系統(tǒng)申窘,關(guān)聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi)妹沙,這樣就增加了速度并提高了靈活性偶洋。
MySQL所使用的 SQL 語言是用于訪問數(shù)據(jù)庫的最常用標準化語言。MySQL 軟件采用了雙授權(quán)政策距糖,它分為社區(qū)版和商業(yè)版玄窝,由于其體積小、速度快悍引、總體擁有成本低恩脂,尤其是開放源碼這一特點,一般中小型網(wǎng)站的開發(fā)都選擇 MySQL 作為網(wǎng)站數(shù)據(jù)庫趣斤。由于其社區(qū)版的性能卓越俩块,搭配 PHP 和 Apache 可組成良好的開發(fā)環(huán)境。
一浓领、游標
有時玉凯,需要在檢索出來的行中前進或者后退一行或多行。這就是使用游標的原因联贩。游標是一個存儲在MySQL服務(wù)器上的數(shù)據(jù)庫查詢漫仆,它不是一條SELECT語句,而是被該語句檢索出來的結(jié)果集泪幌。在存儲了游標之后盲厌,應(yīng)用程序可以根據(jù)需要滾動或瀏覽其中的數(shù)據(jù)。
游標主要用于交互式應(yīng)用祸泪,其中用戶需要滾動屏幕上的數(shù)據(jù)吗浩,并對數(shù)據(jù)進行瀏覽或做出更改。
二没隘、使用游標
使用游標及幾個明確的步驟:
(1)在能夠使用游標前懂扼,必須聲明(定義)它。這個過程實際上沒有檢索數(shù)據(jù)升略,它只是定義要使用的SELECT語句微王。
(2)一旦聲明后,必須打開游標以供使用品嚣。這個過程用前面定義的SELECT語句把數(shù)據(jù)實際檢索出來炕倘。
(3)對于填有數(shù)據(jù)的游標,根據(jù)需要取出(檢索)各行翰撑。
(4)在結(jié)束游標使用時罩旋,必須關(guān)閉游標
1.創(chuàng)建游標
游標用DECLARE語句創(chuàng)建啊央。DECLARE命名游標,并定
義相應(yīng)的SELECT語句涨醋,根據(jù)需要帶WHERE和其他子句瓜饥。例如,以下語句定義了名為ordernumbers的游標浴骂,使用了可以檢索所有訂單的SELECT語句乓土。
CREATE PROCEDURE processorders()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
END;
DECLARE語句用來定義和命名游標,這里為ordernumbers溯警。存儲過程處理完成后趣苏,游標就消失(因為它局限于存儲過程)。
2.打開和關(guān)閉游標
游標用OPEN CURSOR語句來打開:
OPEN ordernumbers;
在處理OPEN語句時執(zhí)行查詢梯轻,存儲檢索出的數(shù)據(jù)以供瀏覽和滾動食磕。游標處理完成后,應(yīng)該使用如下語句關(guān)閉游標:
CLOSE ordernumbers;
下面是上述例子的修改版本:
CREATE PROCEDURE processorders()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
OPEN ordernumbers;
CLOSE ordernumbers;
END;
這個存儲過程聲明喳挑、打開和關(guān)閉一個游標彬伦。但對檢索出來的數(shù)據(jù)什么也沒做。
3.使用游標數(shù)據(jù)
從游標中檢索單個行(第一行):
CREATE PROCEDURE processorders()
BEGIN
DECLARE o INT;
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
OPEN ordernumbers;
FETCH ordernumbers INTO o;
CLOSE ordernumbers;
END;
其中FETCH用來檢索當前行的order_num列(將自動從第一行開始)到一個名為o的局部聲明的變量中伊诵。對檢索出來的數(shù)據(jù)不做任何處理单绑。
循環(huán)檢索數(shù)據(jù),從第一行到最后一行:
CREATE PROCEDURE processorders()
BEGIN
DECLARE done BOOLEAN DEFAULT 0;
DECLARE o INT;
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
OPEN ordernumbers;
REPEAT
FETCH ordernumbers INTO o;
UNTIL done END REPEAT;
CLOSE ordernumbers;
END;
其中FETCH用來檢索當前行的order_num列到一個名為o的局部聲明的變量中曹宴。FETCH在REPEAT內(nèi)询张,因此它反復(fù)執(zhí)行直到done為真(由UNTIL done END REPEAT;規(guī)定)。為了使它起作用浙炼,用一個DEFAULT 0(假,不結(jié)束)定義變量done唯袄。以下的語句可以將done設(shè)置為真:
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
這條語句定義了一個DECLARE CONTINUE弯屈,它是在條件出現(xiàn)時被執(zhí)行的代碼。這里恋拷,它指出當SQLSTATE '02000' 出現(xiàn)時资厉,SET done=1。SQLSTATE '02000' 是一個未找到條件蔬顾。當REPEAT由于沒有更多的行供循環(huán)而不能繼續(xù)時宴偿,出現(xiàn)這個條件。
如果調(diào)用這個存儲過程诀豁,它將定義幾個變量和一個CONTINUE HANDLER窄刘,定義并打開一個游標,重復(fù)讀取所有行舷胜,然后關(guān)閉游標娩践。如果一切正常,可以在循環(huán)內(nèi)放入任意需要的處理(在 FETCH 語句之后,循環(huán)結(jié)束之前)翻伺。