欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL游標詳細介紹

 更新時間:2021年12月21日 09:00:42   作者:我是一棵卷心菜  
大家好,本篇文章主要講的是MySQL游標詳細介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽

1、什么是游標(或光標)

雖然我們也可以通過篩選條件 WHERE 和 HAVING,或者是限定返回記錄的關(guān)鍵字 LIMIT 返回一條記錄,但是,卻無法在結(jié)果集中像指針一樣,向前定位一條記錄、向后定位一條記錄,或者是隨意定位到某一條記錄,并對記錄的數(shù)據(jù)進行處理。

這個時候,就可以用到游標。游標,提供了一種靈活的操作方式,讓我們能夠?qū)Y(jié)果集中的每一條記錄進行定位,并對指向的記錄中的數(shù)據(jù)進行操作的數(shù)據(jù)結(jié)構(gòu)。游標讓 SQL 這種面向集合的語言有了面向過程開發(fā)的能力。

SQL 中,游標是一種臨時的數(shù)據(jù)庫對象,可以指向存儲在數(shù)據(jù)庫表中的數(shù)據(jù)行指針。這里游標充當了指針的作用,我們可以通過操作游標來對數(shù)據(jù)行進行操作MySQL中游標可以在存儲過程和函數(shù)中使用

比如,我們查詢了 employees 數(shù)據(jù)表中工資高于15000的員工都有哪些:

SELECT employee_id,last_name,salary FROM employees
WHERE salary > 15000;

請?zhí)砑訄D片描述

這里我們就可以通過游標來操作數(shù)據(jù)行,如圖所示此時游標所在的行是“108”的記錄,我們也可以在結(jié)果集上滾動游標,指向結(jié)果集中的任意一行。

2、如何使用游標

游標必須在聲明處理程序之前被聲明,并且變量和條件還必須在聲明游標或處理程序之前被聲明。

1、聲明游標

語法格式:

DECLARE 游標名 CURSOR FOR 查詢語句; 

要使用 SELECT 語句來獲取數(shù)據(jù)結(jié)果集,而此時還沒有開始遍歷數(shù)據(jù),這里 查詢語句代表的是 SELECT 語句,返回一個用于創(chuàng)建游標的結(jié)果集

舉例:

DECLARE emp_cur CURSOR FOR 
SELECT employee_id,salary FROM employees;

2、打開游標

語法格式:

OPEN 游標名;

當我們定義好游標之后,如果想要使用游標,必須先打開游標。打開游標的時候 SELECT 語句的查詢結(jié)果集就會送到游標工作區(qū),為后面游標的逐條讀取結(jié)果集中的記錄做準備。

3、使用游標

語法格式:

FETCH 游標名 INTO var_name [, var_name] ...

這句的作用是使用 游標名這個游標來讀取當前行,并且將數(shù)據(jù)保存到 var_name 這個變量中,游標指針指到下一行。如果游標讀取的數(shù)據(jù)行有多個列名,則在 INTO 關(guān)鍵字后面賦值給多個變量名即可。

注意: var_name必須在聲明游標之前就定義好。

舉例:

FETCH emp_cur INTO emp_id, emp_sal ;

注意: 游標的查詢結(jié)果集中的字段數(shù),必須跟 INTO 后面的變量數(shù)一致

4、關(guān)閉游標

語法格式:

CLOSE 游標名;

當我們使用完游標后需要關(guān)閉掉該游標。因為游標會占用系統(tǒng)資源,如果不及時關(guān)閉,游標會一直保持到存儲過程結(jié)束,影響系統(tǒng)運行的效率。而關(guān)閉游標的操作,會釋放游標占用的系統(tǒng)資源。

關(guān)閉游標之后,我們就不能再檢索查詢結(jié)果中的數(shù)據(jù)行,如果需要檢索只能再次打開游標。

3、代碼舉例

#創(chuàng)建存儲過程“get_count_by_limit_total_salary()”,
#聲明IN參數(shù) limit_total_salary,DOUBLE類型;聲明OUT參數(shù)total_count,INT類型。
#函數(shù)的功能可以實現(xiàn)累加薪資最高的幾個員工的薪資值,
#直到薪資總和達到limit_total_salary參數(shù)的值,返回累加的人數(shù)給total_count。

DELIMITER $
CREATE PROCEDURE get_count_by_limit_total_salary(IN limit_total_salary DOUBLE,OUT total_count INT)
BEGIN
	DECLARE count_emp INT DEFAULT 0;	#用來記錄人數(shù),默認值是0
	DECLARE sum_sal DOUBLE DEFAULT 0;	#記錄總薪資
	DECLARE one_sal DOUBLE DEFAULT 0;	#記錄一個人的薪資
	
	#聲明游標,把查詢到的工資結(jié)果集從高到低排序
	DECLARE emp_cur CURSOR FOR SELECT salary FROM employees ORDER BY salary DESC;
	
	OPEN emp_cur;	#打開游標
	
	#用循環(huán)語句遍歷,知道總薪資滿足題目要求
	REPEAT
		#開始使用游標
		FETCH emp_cur INTO one_sal;
		
		SET sum_sal = sum_sal + one_sal;
		SET count_emp = count_emp + 1;
		
		UNTIL sum_sal >= limit_total_salary
		
	END REPEAT;
	CLOSE emp_cur;	#關(guān)閉游標
	
	#把結(jié)果返回給total_count
	SELECT count_emp INTO total_count;
END $
DELIMITER ;

CALL get_count_by_limit_total_salary(30000,@count);
SELECT @count;

思路分析: 先創(chuàng)建存儲過程,然后再根據(jù)實際情況declare自己需要的變量來滿足題目的要求,游標要按步驟來:創(chuàng)建游標、打開游標、使用游標最后再關(guān)閉游標;其中要注意使用游標在循環(huán)中,可以提高代碼的簡潔度。

4、小結(jié)

游標是 MySQL 的一個重要的功能,為逐條讀取結(jié)果集中的數(shù)據(jù),提供了完美的解決方案。跟在應(yīng)用層面實現(xiàn)相同的功能相比,游標可以在存儲程序中使用,效率高,程序也更加簡潔。

但同時也會帶來一些性能問題,比如在使用游標的過程中,會對數(shù)據(jù)行進行加鎖,這樣在業(yè)務(wù)并發(fā)量大的時候,不僅會影響業(yè)務(wù)之間的效率,還會消耗系統(tǒng)資源,造成內(nèi)存不足,這是因為游標是在內(nèi)存中進行的處理。

建議: 養(yǎng)成用完之后就關(guān)閉的習(xí)慣,這樣才能提高系統(tǒng)的整體效率。

愛在結(jié)尾:游標的使用結(jié)合了以前學(xué)習(xí)過的存儲過程、流程控制以及用戶自定義變量相關(guān)的知識點,單單看游標這一個知識點是不難的,自己還是應(yīng)該多多回顧以前學(xué)過的知識點,做到融會貫通。

到此這篇關(guān)于MySQL游標詳細介紹的文章就介紹到這了,更多相關(guān)MySQL游標內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論