溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL之存儲過程和函數(shù)的示例分析

發(fā)布時間:2021-02-26 12:48:45 來源:億速云 閱讀:190 作者:小新 欄目:MySQL數(shù)據(jù)庫

這篇文章將為大家詳細(xì)講解有關(guān)MySQL之存儲過程和函數(shù)的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。


一、變量

系統(tǒng)變量

系統(tǒng)變量分為全局變量會話變量,是由系統(tǒng)提供的。

  • 全局變量作用域:服務(wù)器每次啟動將為所有的全局變量初始化,不能跨重啟。

  • 會話變量作用域:僅針對當(dāng)前會話有效。

【全局變量】 
作用域:服務(wù)器每次啟動將為所有的全局變量初始化,不能跨重啟# 1.查看所有的全局變量SHOW GLOBAL VARIABLES;# 2.查看部分全局變量SHOW GLOBAL VARIABLES LIKE '%char%';# 3.查看某個全局變量的值SELECT @@global.autocommit;# 查看是否自動提交SELECT @@global.tx_isolation;# 查看隔離級別#4.為某個指定的全局變量賦值SET @@global.autocommit=0;【會話變量】
作用域:僅針對當(dāng)前會話有效.# 1.查看所有的會話變量SHOW SESSION VARIABLES;SHOW VARIABLES;#默認(rèn)省略session# 2.查看部分會話變量SHOW SESSION VARIABLES LIKE '%char%';# 3.查看某個會話變量的值SELECT @@tx_isolation;SELECT @@session.tx_isolation;# 4.為某個指定的會話變量賦值SET @@session.autocommit=0;

自定義變量

自定義變量分為用戶變量局部變量,是用戶自定義的。

對比作用域定義和使用位置語法
用戶變量當(dāng)前會話會話中的任何地方必須加@符號,不用限定類型
局部變量BEGIN…END中只能在BEGIN…END中,且為第一句話一般不加@符號,需要限定類型
【用戶變量】
作用域:針對當(dāng)前會話有效,和會話變量的作用域相同# 聲明并初始化# 下面三種方式都可以SET @count=1; # set @count:=1;# select @count:=1;# 賦值SELECT COUNT(*) INTO @count FROM employees;# 查看用戶變量SELECT @count;【局部變量】
作用域:僅在定義的begin end中有效,應(yīng)用在begin end中的第一句話# 聲明DECLARE 變量名 類型;# declare 變量名 類型 default 值;# 賦值SET 局部變量名=值;# 或set 局部變量名:=值;# select @局部變量名:=值# 使用SELECT 局部變量名;【案例】# 案例:聲明兩個變量并賦初值,求和,打印# 用戶變量SET @m=1;SET @n=2;SET @sum=@m+@n;SELECT @sum;# 局部變量[只能在begin...end中運行]DECLARE m INT DEFAULT 1;DECLARE n INT DEFAULT 2;DECLARE SUM INT;SET SUM=m+n;SELECT SUM;

二、存儲過程

定義:事先經(jīng)過編譯并存儲在數(shù)據(jù)庫中的一組sql語句的集合。

存儲過程的優(yōu)點:①提高代碼重用性 ②減少編譯與連接次數(shù) ③提高效率。

創(chuàng)建語法:

CREATE PROCEDURE 存儲過程名(參數(shù)列表)
BEGIN
存儲過程體(一組合法的sql語句);
END 結(jié)束符

調(diào)用語法:
CALL 存儲過程名(實參列表)

刪除語法:
DROP PROCEDURE 存儲過程名;

查看語法:
SHOW CREATE PROCEDURE 存儲過程名;

存儲過程的參數(shù)別聊提供了3種參數(shù):

  • IN:需要輸入,需要調(diào)用方傳入值。

  • OUT:可以輸出,可以作為返回值。

  • INOUT:可以輸入和輸出,既需要入?yún)⒂中枰祷刂怠?/p>

注意:

  • 如果存儲過程只有一句話,可以省略BEGIN END。

  • 存儲過程體中的每條sql語句的結(jié)尾要求必須加分號。

  • 存儲過程的結(jié)尾可以使用delimiter重寫結(jié)束標(biāo)志,DELIMITER 結(jié)束標(biāo)記。

【空參存儲過程】# 案例:向admin表中插入5條記錄# 重置結(jié)尾符為$DELIMITER $# 創(chuàng)建存儲過程CREATE PROCEDURE myp1()BEGIN
   INSERT INTO admin(username,PASSWORD)
   VALUES('join1','000'),('join2','000'),('join3','000'),('join4','000'),('join5','000');END $# 調(diào)用存儲過程CALL myp1()$



【帶in模式的存儲過程】# 案例:創(chuàng)建存儲過程,實現(xiàn)根據(jù)女神名查詢對應(yīng)的男朋友信息CREATE PROCEDURE myp2(IN beautyName VARCHAR(20))BEGIN
	SELECT bo.*
	FROM boys bo	RIGHT JOIN beauty b 
	ON bo.id=b.boyfriend_id	WHERE b.name=beautyName;END$CALL myp2('柳巖')$# 案例:創(chuàng)建存儲過程,查看用戶是否登錄成功CREATE PROCEDURE myp3(IN username VARCHAR(10),IN PASSWORD VARCHAR(10))BEGIN
	DECLARE result INT DEFAULT 0;# 聲明并初始化
	
	SELECT COUNT(*) INTO result# 賦值
	FROM admin	WHERE admin.username=username	AND PASSWORD=PASSWORD;
	
	SELECT IF(result,'成功','失敗');#打印變量END$# 調(diào)用CALL myp3('john','8888')$



【帶out模式的存儲過程】# 案例:根據(jù)女神名,返回對應(yīng)的男神名CREATE PROCEDURE myp4(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20))BEGIN
	SELECT bo.boyName INTO boyName #賦值
	FROM boys bo	INNER JOIN beauty b	ON b.boyfriend_id=bo.id	WHERE b.name=beautyName;END $CALL myp4('熱巴',@bName)$ # 不定義,直接使用用戶變量填充# 調(diào)用SELECT @bName$# 案例:根據(jù)女神名,返回對應(yīng)的男神名和男神魅力值CREATE PROCEDURE myp5(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT userCP INT)BEGIN
	SELECT bo.boyName,bo.userCP INTO boyName,userCP  #賦值
	FROM boys bo	INNER JOIN beauty b	ON b.boyfriend_id=bo.id	WHERE b.name=beautyName;END $CALL myp5('熱巴',@bName,@usercp)$ # 不定義,直接使用用戶變量填充# 調(diào)用SELECT @bName,@userCP$【帶inout模式的存儲過程】# 案例:傳入a和b兩個值,最終a和b都翻倍并返回CREATE PROCEDURE myp6(INOUT a INT,INOUT b INT)BEGIN
	SET a=a*2;
	SET b=b*2;END $SET @m=10$SET @n=20$CALL myp6(@m,@n)$SELECT @m,@n$

學(xué)習(xí)了存儲過程,嘗試完成下列習(xí)題吧
MySQL之存儲過程和函數(shù)的示例分析
習(xí)題答案如下↓

【習(xí)題答案】# 習(xí)題1:創(chuàng)建存儲過程實現(xiàn)傳入用戶名和密碼,插入到admin表中DELIMITER $CREATE PROCEDURE test_1(IN username VARCHAR(10), IN loginPwd VARCHAR(10))BEGIN
	INSERT INTO admin(admin.username,PASSWORD)
	VALUES(username,loginPwd);END $CALL test_1('admin','111')$# 習(xí)題2:創(chuàng)建存儲過程或函數(shù)實現(xiàn)傳入女神編號,返回女神名稱和電話CREATE PROCEDURE test_2(IN id INT,OUT NAME VARCHAR(20),OUT phone VARCHAR(20))BEGIN 
	SELECT b.name,b.phone INTO NAME,phone	FROM beauty b	WHERE b.id=id;END $CALL test_2(1,@n,@p)$SELECT @n,@p;# 習(xí)題3:創(chuàng)建存儲過程或函數(shù)實現(xiàn)傳入兩個女神的生日,返回大小CREATE PROCEDURE test_3(IN birth2 DATETIME,IN birth3 DATETIME,OUT result INT)BEGIN
	SELECT DATEDIFF(birth2,birth3) INTO result;END $CALL test_3('1998-1-1',NOW(),@result)$SELECT @result$# 習(xí)題4:創(chuàng)建存儲過程或函數(shù)實現(xiàn)傳入一個日期,格式化成 xx 年 xx 月 xx 日并返回CREATE PROCEDURE test_4(IN mydate DATETIME,OUT strdate VARCHAR(50))BEGIN
	SELECT DATE_FORMAT(mydate,'%y年%m月%d日') INTO strdate;END $CALL test_4(NOW(),@str)$SELECT @str $#習(xí)題5:創(chuàng)建存儲過程或函數(shù)實現(xiàn)傳入女神名稱,返回:女神 and 男神 格式的字符串CREATE PROCEDURE test_5(IN beautyName VARCHAR(20),OUT str VARCHAR(50))BEGIN
	SELECT CONCAT(beautyName,'and',IFNULL(boyName,'null')) INTO str	FROM boys bo	RIGHT JOIN beauty b	ON b.boyfriend_id=bo.id	WHERE b.name=beautyName;END $CALL test_5('熱巴',@str)$SELECT @str $#習(xí)題6:創(chuàng)建存儲過程或函數(shù),根據(jù)傳入的條目數(shù)和起始索引,查詢 beauty 表的記錄CREATE PROCEDURE test_6(IN startIndex INT,IN size INT)BEGIN
	SELECT * FROM beauty LIMIT startIndex,size;END $CALL test_6(3,5)$

三、函數(shù)

存儲過程和函數(shù)的區(qū)別?

  • 存儲過程可以有0個或多個返回;函數(shù)有且只有一個返回。

  • 存儲過程適合做批量插入、批量更新;函數(shù)適合做處理數(shù)據(jù)后返回一個結(jié)果。

創(chuàng)建語法:
CREATE FUNCTION 函數(shù)名(參數(shù)列表) RETURNS 返回類型
BEGIN
函數(shù)體(一定有return語句);
END 結(jié)束符

調(diào)用語法:
SELECT 函數(shù)名(參數(shù)列表)

查看函數(shù):
SHOW CREATE FUNCTION my_f3;

刪除函數(shù):
DROP FUNCTION my_f3;

【無參有返回】# 返回公司的員工個數(shù)CREATE FUNCTION my_f1() RETURNS INTBEGIN
	DECLARE n INT DEFAULT 0;# 定義變量
	SELECT COUNT(*) INTO n # 賦值
	FROM employees;
	RETURN n;END $SELECT my_f1()$

【有參有返回】# 根據(jù)員工名,返回工資CREATE FUNCTION my_f2(empName VARCHAR(20)) RETURNS DOUBLEBEGIN
	SET @sal=0;# 定義用戶變量
	SELECT salary INTO @sal # 賦值
	FROM employees	WHERE last_name=empName;
	RETURN @sal;END $SELECT my_f2('Kochhar')$# 3.根據(jù)部門名,返回該部門平均工資CREATE FUNCTION my_f3(deptName VARCHAR(20)) RETURNS DOUBLEBEGIN
	DECLARE sal DOUBLE;
	SELECT AVG(Salary) INTO sal	FROM employees e	JOIN departments d	ON e.department_id=d.department_id	WHERE d.department_name=deptName;
	RETURN sal;END $SELECT my_f3('IT')$

學(xué)習(xí)了mysql的函數(shù),嘗試完成下列習(xí)題
MySQL之存儲過程和函數(shù)的示例分析
答案:
1、
CREATE FUNCTION test_1(num1 FLOAT,num2 FLOAT) RETURNS FLOAT
BEGIN
DECLARE SUM FLOAT DEFAULT 0;
SET SUM=num1+num2;
RETURN SUM;
END $
SELECT test_1(1,2)$
2、
CREATE FUNCTION test_2(jobName VARCHAR(20)) RETURNS INT
BEGIN
DECLARE number INT DEFAULT 0; # 定義變量
SELECT COUNT(employee_id) INTO number # 賦值
FROM employees e
JOIN jobs j ON e.job_id=j.job_id
WHERE j.job_title=jobName;
RETURN number;
END $
SELECT test_2(‘President’)$
3、
CREATE FUNCTION test_3(empName VARCHAR(20)) RETURNS VARCHAR(20)
BEGIN
DECLARE managerName VARCHAR(20) DEFAULT ‘’; # 定義變量
SELECT e1.last_name AS managerName INTO managerName # 賦值
FROM employees e1
WHERE e1.employee_id=(SELECT e2.manager_id FROM employees e2 WHERE e2.last_name=empName);
RETURN managerName;
END $
SELECT test_3(‘Kochhar’)$

關(guān)于“MySQL之存儲過程和函數(shù)的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI