中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

MySQL之存儲過程和函數的示例分析

發布時間:2021-02-26 12:48:45 來源:億速云 閱讀:191 作者:小新 欄目:MySQL數據庫

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


一、變量

系統變量

系統變量分為全局變量會話變量,是由系統提供的。

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

  • 會話變量作用域:僅針對當前會話有效。

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

自定義變量

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

對比作用域定義和使用位置語法
用戶變量當前會話會話中的任何地方必須加@符號,不用限定類型
局部變量BEGIN…END中只能在BEGIN…END中,且為第一句話一般不加@符號,需要限定類型
【用戶變量】
作用域:針對當前會話有效,和會話變量的作用域相同# 聲明并初始化# 下面三種方式都可以SET @count=1; # set @count:=1;# select @count:=1;# 賦值SELECT COUNT(*) INTO @count FROM employees;# 查看用戶變量SELECT @count;【局部變量】
作用域:僅在定義的begin end中有效,應用在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;

二、存儲過程

定義:事先經過編譯并存儲在數據庫中的一組sql語句的集合。

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

創建語法:

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

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

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

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

存儲過程的參數別聊提供了3種參數:

  • IN:需要輸入,需要調用方傳入值。

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

  • INOUT:可以輸入和輸出,既需要入參又需要返回值。

注意:

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

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

  • 存儲過程的結尾可以使用delimiter重寫結束標志,DELIMITER 結束標記。

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



【帶in模式的存儲過程】# 案例:創建存儲過程,實現根據女神名查詢對應的男朋友信息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('柳巖')$# 案例:創建存儲過程,查看用戶是否登錄成功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$# 調用CALL myp3('john','8888')$



【帶out模式的存儲過程】# 案例:根據女神名,返回對應的男神名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)$ # 不定義,直接使用用戶變量填充# 調用SELECT @bName$# 案例:根據女神名,返回對應的男神名和男神魅力值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)$ # 不定義,直接使用用戶變量填充# 調用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$

學習了存儲過程,嘗試完成下列習題吧
MySQL之存儲過程和函數的示例分析
習題答案如下↓

【習題答案】# 習題1:創建存儲過程實現傳入用戶名和密碼,插入到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')$# 習題2:創建存儲過程或函數實現傳入女神編號,返回女神名稱和電話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;# 習題3:創建存儲過程或函數實現傳入兩個女神的生日,返回大小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$# 習題4:創建存儲過程或函數實現傳入一個日期,格式化成 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 $#習題5:創建存儲過程或函數實現傳入女神名稱,返回:女神 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 $#習題6:創建存儲過程或函數,根據傳入的條目數和起始索引,查詢 beauty 表的記錄CREATE PROCEDURE test_6(IN startIndex INT,IN size INT)BEGIN
	SELECT * FROM beauty LIMIT startIndex,size;END $CALL test_6(3,5)$

三、函數

存儲過程和函數的區別?

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

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

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

調用語法:
SELECT 函數名(參數列表)

查看函數:
SHOW CREATE FUNCTION my_f3;

刪除函數:
DROP FUNCTION my_f3;

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

【有參有返回】# 根據員工名,返回工資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.根據部門名,返回該部門平均工資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')$

學習了mysql的函數,嘗試完成下列習題
MySQL之存儲過程和函數的示例分析
答案:
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’)$

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南和县| 文安县| 乌拉特前旗| 长沙县| 安龙县| 郸城县| 洮南市| 新乐市| 阳西县| 乌鲁木齐市| 普定县| 右玉县| 南岸区| 紫阳县| 石林| 巴林右旗| 临沂市| 昌邑市| 九寨沟县| 浦北县| 吴川市| 崇左市| 博罗县| 崇阳县| 绥化市| 伊金霍洛旗| 德州市| 陇南市| 苍梧县| 五台县| 长沙市| 印江| 阳朔县| 建平县| 炎陵县| 绥滨县| 怀集县| 尖扎县| 巨野县| 海南省| 徐闻县|