中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

MySQL數(shù)據(jù)庫高級(九)——游標(biāo)

MySQL數(shù)據(jù)庫高級(九)——游標(biāo)

一、游標(biāo)簡介

1、游標(biāo)簡介

游標(biāo)的設(shè)計是一種數(shù)據(jù)緩沖區(qū)的思想,用來存放SQL語句執(zhí)行的結(jié)果。游標(biāo)是一種能從包括多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄的機(jī)制。
盡管游標(biāo)能遍歷結(jié)果中的所有行,但一次只指向一行。
游標(biāo)的作用就是用于對查詢數(shù)據(jù)庫所返回的記錄進(jìn)行遍歷,以便進(jìn)行相應(yīng)的操作。

成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供小店網(wǎng)站建設(shè)、小店做網(wǎng)站、小店網(wǎng)站設(shè)計、小店網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、小店企業(yè)網(wǎng)站模板建站服務(wù),10年小店做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

2、游標(biāo)的特性

游標(biāo)具有三個屬性:
A、不敏感(Asensitive):數(shù)據(jù)庫可以選擇不復(fù)制結(jié)果集
B、只讀(Read only)
C、不滾動(Nonscrollable):游標(biāo)只能向一個方向前進(jìn),并且不可以跳過任何一行數(shù)據(jù)。

3、游標(biāo)的優(yōu)點

游標(biāo)是針對行操作的,對從數(shù)據(jù)庫中SELECT查詢得到的結(jié)果集的每一行可以進(jìn)行分開的獨(dú)立的相同或不同的操作,是一種分離的思想。游標(biāo)是面向集合與面向行的設(shè)計思想之間的一種橋梁。

4、游標(biāo)的缺點

游標(biāo)的主要缺點是性能不高。
游標(biāo)的開銷與游標(biāo)中進(jìn)行的操作相關(guān),如果在游標(biāo)中進(jìn)行復(fù)雜的操作,開銷會非常高。如果采用面向集合的SQL語句,掃描成本為O(N);但如果采用面向集合的SQL語句的掃描成本為O(N*N),則使用游標(biāo)有可能會帶來性能上的提升。
游標(biāo)的缺點是只能一行一行操作。在數(shù)據(jù)量大的情況下,速度過慢。數(shù)據(jù)庫大部分是面對集合的,業(yè)務(wù)會比較復(fù)雜,而游標(biāo)使用會有死鎖,影響其他的業(yè)務(wù)操作,不可取。 當(dāng)數(shù)據(jù)量大時,使用游標(biāo)會造成內(nèi)存不足現(xiàn)象。

5、游標(biāo)的適用場景

MySQL數(shù)據(jù)庫中,可以在存儲過程、函數(shù)、觸發(fā)器、事件中使用游標(biāo)。

二、游標(biāo)的操作

1、游標(biāo)的定義

DECLARE?cursor_name?CURSOR?FOR?select_statement??

2、打開游標(biāo)

OPEN?cursor_name;

3、取游標(biāo)中的數(shù)據(jù)

FETCH?cursor_name?INTO?var_name?[,?var_name]...

4、關(guān)閉游標(biāo)

CLOSE cursor_name;

5、釋放游標(biāo)

DEALLOCATE cursor_name;

三、游標(biāo)實例

1、創(chuàng)建一張游標(biāo)的測試表

CREATE TABLE cursor_table
(
id INT ,
name VARCHAR(10),
age INT
)ENGINE=innoDB DEFAULT CHARSET=utf8;
insert into cursor_table values(1, '孫悟空', 500);
insert into cursor_table values(2, '豬八戒', 200);
insert into cursor_table values(3, '沙悟凈', 100);
insert into cursor_table values(4, '唐僧', 20);

使用三種方式使用游標(biāo)創(chuàng)建一個存儲過程,統(tǒng)計年齡大于30的記錄的數(shù)量。

2、Loop循環(huán)

CREATE  PROCEDURE getTotal()
BEGIN  
    DECLARE total INT; 
    ##創(chuàng)建接收游標(biāo)數(shù)據(jù)的變量  
    DECLARE sid INT;  
    DECLARE sname VARCHAR(10);  
    #創(chuàng)建總數(shù)變量  
    DECLARE sage INT;  
    #創(chuàng)建結(jié)束標(biāo)志變量  
    DECLARE done INT DEFAULT false;  
    #創(chuàng)建游標(biāo)  
    DECLARE cur CURSOR FOR SELECT id,name,age from cursor_table where age>30;  
    #指定游標(biāo)循環(huán)結(jié)束時的返回值  
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;  
    #設(shè)置初始值  
    SET sage = 0;  
    SET total=0;
    #打開游標(biāo)  
    OPEN cur;  
    #開始循環(huán)游標(biāo)里的數(shù)據(jù)  
    read_loop:loop  
    #根據(jù)游標(biāo)當(dāng)前指向的一條數(shù)據(jù)  
    FETCH cur INTO sid,sname,sage;  
    #判斷游標(biāo)的循環(huán)是否結(jié)束  
    IF done THEN  
        LEAVE read_loop;    #跳出游標(biāo)循環(huán)  
    END IF;  
    #獲取一條數(shù)據(jù)時,將count值進(jìn)行累加操作,這里可以做任意你想做的操作,  
    SET total = total + 1;  
    #結(jié)束游標(biāo)循環(huán)  
    END LOOP;  
    #關(guān)閉游標(biāo)  
    CLOSE cur;  

    #輸出結(jié)果  
    SELECT total;  
END
#調(diào)用存儲過程  
call getTotal();  

3、While循環(huán)

CREATE  PROCEDURE getTotal()
BEGIN  
    DECLARE total INT; 
    ##創(chuàng)建接收游標(biāo)數(shù)據(jù)的變量  
    DECLARE sid INT;  
    DECLARE sname VARCHAR(10);  
    #創(chuàng)建總數(shù)變量  
    DECLARE sage INT;  
    #創(chuàng)建結(jié)束標(biāo)志變量  
    DECLARE done INT DEFAULT false;  
    #創(chuàng)建游標(biāo)  
    DECLARE cur CURSOR FOR SELECT id,name,age from cursor_table where age>30;  
    #指定游標(biāo)循環(huán)結(jié)束時的返回值  
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;   
    SET total = 0;  
    OPEN cur;  
    FETCH cur INTO sid, sname, sage;  
    WHILE(NOT done) 
    DO  
        SET total = total + 1;  
        FETCH cur INTO sid, sname, sage;  
    END WHILE;  

    CLOSE cur;  
    SELECT total;  
END

4、Repeat循環(huán)

CREATE getTotal()
BEGIN  
    DECLARE total INT; 
    ##創(chuàng)建接收游標(biāo)數(shù)據(jù)的變量  
    DECLARE sid INT;  
    DECLARE sname VARCHAR(10);  
    #創(chuàng)建總數(shù)變量  
    DECLARE sage INT;  
    #創(chuàng)建結(jié)束標(biāo)志變量  
    DECLARE done INT DEFAULT false;  
    #創(chuàng)建游標(biāo)  
    DECLARE cur CURSOR FOR SELECT id,name,age from cursor_table where age > 30;  
    #指定游標(biāo)循環(huán)結(jié)束時的返回值  
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;   
    SET total = 0;  
    OPEN cur;  
    REPEAT  
    FETCH cur INTO sid, sname, sage;   
    IF NOT done THEN  
        SET total = total + 1;  
    END IF;  
    UNTIL done END REPEAT;  
    CLOSE cur;  
    SELECT total;  
END

當(dāng)前文章:MySQL數(shù)據(jù)庫高級(九)——游標(biāo)
URL分享:http://www.rwnh.cn/article12/jgppgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計、做網(wǎng)站、網(wǎng)站收錄、App開發(fā)、虛擬主機(jī)、用戶體驗

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
禹城市| 盐亭县| 咸丰县| 甘谷县| 万载县| 阿荣旗| 楚雄市| 馆陶县| 孟津县| 彭州市| 都安| 鄂托克旗| 苍南县| 阿克苏市| 蓝田县| 新郑市| 勃利县| 驻马店市| 保定市| 盐亭县| 新乡县| 射阳县| 东乡族自治县| 阜阳市| 莆田市| 苏尼特右旗| 合作市| 扶风县| 谢通门县| 安龙县| 乌恰县| 新巴尔虎左旗| 平昌县| 诸城市| 松潘县| 互助| 教育| 稷山县| 兰溪市| 斗六市| 达州市|