MySQL游標詳細介紹
1、什么是游標(或光標)
雖然我們也可以通過篩選條件 WHERE 和 HAVING,或者是限定返回記錄的關鍵字 LIMIT 返回一條記錄,但是,卻無法在結果集中像指針一樣,向前定位一條記錄、向后定位一條記錄,或者是隨意定位到某一條記錄
,并對記錄的數據進行處理。
這個時候,就可以用到游標。游標,提供了一種靈活的操作方式,讓我們能夠對結果集中的每一條記錄進行定位,并對指向的記錄中的數據進行操作的數據結構。游標讓 SQL 這種面向集合的語言有了面向過程開發(fā)的能力。
SQL 中,游標是一種臨時的數據庫對象,可以指向存儲在數據庫表中的數據行指針。這里游標充當了指針的作用
,我們可以通過操作游標來對數據行進行操作MySQL中游標可以在存儲過程和函數中使用
比如,我們查詢了 employees 數據表中工資高于15000的員工都有哪些:
SELECT employee_id,last_name,salary FROM employees WHERE salary > 15000;
這里我們就可以通過游標來操作數據行,如圖所示此時游標所在的行是“108”的記錄,我們也可以在結果集上滾動游標,指向結果集中的任意一行。
2、如何使用游標
游標必須在聲明處理程序之前被聲明,并且變量和條件還必須在聲明游標或處理程序之前被聲明。
1、聲明游標
語法格式:
DECLARE 游標名 CURSOR FOR 查詢語句;
要使用 SELECT 語句來獲取數據結果集,而此時還沒有開始遍歷數據,這里 查詢語句代表的是 SELECT 語句,返回一個用于創(chuàng)建游標的結果集
舉例:
DECLARE emp_cur CURSOR FOR SELECT employee_id,salary FROM employees;
2、打開游標
語法格式:
OPEN 游標名;
當我們定義好游標之后,如果想要使用游標,必須先打開游標。打開游標的時候 SELECT 語句的查詢結果集就會送到游標工作區(qū),為后面游標的逐條讀取
結果集中的記錄做準備。
3、使用游標
語法格式:
FETCH 游標名 INTO var_name [, var_name] ...
這句的作用是使用 游標名
這個游標來讀取當前行,并且將數據保存到 var_name 這個變量中,游標指針指到下一行。如果游標讀取的數據行有多個列名,則在 INTO 關鍵字后面賦值給多個變量名即可。
注意: var_name必須在聲明游標之前就定義好。
舉例:
FETCH emp_cur INTO emp_id, emp_sal ;
注意: 游標的查詢結果集中的字段數,必須跟 INTO 后面的變量數一致
4、關閉游標
語法格式:
CLOSE 游標名;
當我們使用完游標后需要關閉掉該游標。因為游標會占用系統(tǒng)資源
,如果不及時關閉,游標會一直保持到存儲過程結束,影響系統(tǒng)運行的效率。而關閉游標的操作,會釋放游標占用的系統(tǒng)資源。
關閉游標之后,我們就不能再檢索查詢結果中的數據行,如果需要檢索只能再次打開游標。
3、代碼舉例
#創(chuàng)建存儲過程“get_count_by_limit_total_salary()”, #聲明IN參數 limit_total_salary,DOUBLE類型;聲明OUT參數total_count,INT類型。 #函數的功能可以實現累加薪資最高的幾個員工的薪資值, #直到薪資總和達到limit_total_salary參數的值,返回累加的人數給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; #用來記錄人數,默認值是0 DECLARE sum_sal DOUBLE DEFAULT 0; #記錄總薪資 DECLARE one_sal DOUBLE DEFAULT 0; #記錄一個人的薪資 #聲明游標,把查詢到的工資結果集從高到低排序 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; #關閉游標 #把結果返回給total_count SELECT count_emp INTO total_count; END $ DELIMITER ; CALL get_count_by_limit_total_salary(30000,@count); SELECT @count;
思路分析: 先創(chuàng)建存儲過程,然后再根據實際情況declare自己需要的變量來滿足題目的要求,游標要按步驟來:創(chuàng)建游標、打開游標、使用游標最后再關閉游標;其中要注意使用游標在循環(huán)中,可以提高代碼的簡潔度。
4、小結
游標是 MySQL 的一個重要的功能,為逐條讀取
結果集中的數據,提供了完美的解決方案。跟在應用層面實現相同的功能相比,游標可以在存儲程序中使用,效率高,程序也更加簡潔。
但同時也會帶來一些性能問題,比如在使用游標的過程中,會對數據行進行加鎖
,這樣在業(yè)務并發(fā)量大的時候,不僅會影響業(yè)務之間的效率,還會消耗系統(tǒng)資源
,造成內存不足,這是因為游標是在內存中進行的處理。
建議: 養(yǎng)成用完之后就關閉的習慣,這樣才能提高系統(tǒng)的整體效率。
愛在結尾:游標的使用結合了以前學習過的存儲過程、流程控制以及用戶自定義變量相關的知識點,單單看游標這一個知識點是不難的,自己還是應該多多回顧以前學過的知識點,做到融會貫通。
到此這篇關于MySQL游標詳細介紹的文章就介紹到這了,更多相關MySQL游標內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
mysql unique option prefix myisam_recover instead of myisam-
Using unique option prefix myisam_recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead2016-05-05MySQL出現SQL Error (2013)連接錯誤的解決方法
這篇文章主要介紹了MySQL出現SQL Error (2013)連接錯誤的解決方法,2013錯誤主要還是在于用戶的授權問題,需要的朋友可以參考下2016-06-06MySQL全文索引、聯(lián)合索引、like查詢、json查詢速度哪個快
這篇文章主要介紹了MySQL全文索引、聯(lián)合索引、like查詢、json查詢速度大比拼,通過實例代碼截圖的形式給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02MySQL中distinct語句去查詢重復記錄及相關的性能討論
這篇文章主要介紹了MySQL中distinct語句去查詢重復記錄及相關的性能討論,文中的觀點是在一定情況下避免在最高層查詢中使用distinct,需要的朋友可以參考下2016-01-01mysql數據庫中的information_schema和mysql可以刪除嗎?
這篇文章主要介紹了mysql數據庫中的information_schema和mysql可以刪除嗎這個問題,需要的朋友可以參考下2014-05-05當面試官問mysql中char與varchar的區(qū)別
這篇文章主要以聊天形式圖片的添加,將面試官面試真實場景體現出來,好奇的朋友不要錯過奧2021-08-08