菜鳥學SQL之——存儲過程和函數

存儲過程和函數

一、存儲過程

變量

用戶變量
  • 作用域:針對於當前會話(連接)有效,作用域同於會話變量
  • 賦值操作符:=或:=
  • 聲明賦值語法:SET @變量名=值;
局部變量
  • 作用域:僅僅在定義它的begin end塊中有效
  • 聲明:DECLARE 變量名 類型 【DEFAULT 值】;
  • 賦值:
用戶變量
#①聲明並初始化
SET @變量名=;
SET @變量名:=;
SELECT @變量名:=;

#②賦值(更新變量的值)
#方式一:
	SET @變量名=;
	SET @變量名:=;
	SELECT @變量名:=;
#方式二:
	SELECT 字段 INTO @變量名
	FROM;
#③使用(查看變量的值)
SELECT @變量名;


局部變量
#①聲明
DECLARE 變量名 類型;
DECLARE 變量名 類型 【DEFAULT 值】;


#②賦值(更新變量的值)

#方式一:
	SET 局部變量名=;
	SET 局部變量名:=;
	SELECT 局部變量名:=;
#方式二:
	SELECT 字段 INTO 具備變量名
	FROM;
#③使用(查看變量的值)
SELECT 局部變量名;


#案例:聲明兩個變量,求和並打印

#用戶變量
SET @m=1;
SET @n=1;
SET @sum=@m+@n;
SELECT @sum;

#局部變量
DECLARE m INT DEFAULT 1;
DECLARE n INT DEFAULT 1;
DECLARE SUM INT;
SET SUM=m+n;
SELECT SUM;		

用戶變量 和局部變量對比:

作用域 定義位置 語法
用戶變量 當前會話 會話的任何地方 加@符號,不用指定類型
局部變量 定義它的BEGIN END中 BEGIN END的第一句話 一般不用加@,需要指定類型

存儲過程

  • 含義:一組預先編譯好的SQL語句的集合,理解成批處理語句

  • 好處:

    • 提高代碼的重用性
    • 簡化操作
    • 減少了編譯次數並且減少了和數據庫服務器的連接次數,提高了效率
  • 語法:

    CREATE PROCEDURE 存儲過程名(參數列表)
    BEGIN

    存儲過程體(一組合法的SQL語句)

    END

    注意:參數列表包含三部分:參數模式 參數名 參數類型(eg:in stuname varchar(20))

  • 參數模式:

    • in:該參數可以作爲輸入,也就是該參數需要調用方傳入值
    • out:該參數可以作爲輸出,也就是該參數可以作爲返回值
    • inout:該參數既可以作爲輸入又可以作爲輸出,也就是該參數既需要傳入值,又可以返回值
  • 調用存儲過程:CALL 存儲過程名(實參列表);

#1.空參列表
#案例:插入到admin表中五條記錄

SELECT * FROM admin;

DELIMITER $
CREATE PROCEDURE myp1()
BEGIN
	INSERT INTO admin(username,`password`) 
	VALUES('john1','0000'),('lily','0000'),('rose','0000'),('jack','0000'),('tom','0000');
END $


#調用
CALL myp1()$

#2.創建帶in模式參數的存儲過程

#案例1:創建存儲過程實現 根據女神名,查詢對應的男神信息

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('柳巖')$

#案例2 :創建存儲過程實現,用戶是否登錄成功

CREATE PROCEDURE myp4(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
BEGIN
	DECLARE result INT DEFAULT 0;#聲明並初始化
	
	SELECT COUNT(*) INTO result#賦值
	FROM admin
	WHERE admin.username = username
	AND admin.password = PASSWORD;
	
	SELECT IF(result>0,'成功','失敗');#使用
END $

#調用
CALL myp3('張飛','8888')$


#3.創建out 模式參數的存儲過程
#案例1:根據輸入的女神名,返回對應的男神名

CREATE PROCEDURE myp6(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20))
BEGIN
	SELECT bo.boyname INTO boyname
	FROM boys bo
	RIGHT JOIN
	beauty b ON b.boyfriend_id = bo.id
	WHERE b.name=beautyName ;
	
END $


#案例2:根據輸入的女神名,返回對應的男神名和魅力值

CREATE PROCEDURE myp7(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT usercp INT) 
BEGIN
	SELECT boys.boyname ,boys.usercp INTO boyname,usercp
	FROM boys 
	RIGHT JOIN
	beauty b ON b.boyfriend_id = boys.id
	WHERE b.name=beautyName ;
	
END $


#調用
CALL myp7('小昭',@name,@cp)$
SELECT @name,@cp$



#4.創建帶inout模式參數的存儲過程
#案例1:傳入a和b兩個值,最終a和b都翻倍並返回

CREATE PROCEDURE myp8(INOUT a INT ,INOUT b INT)
BEGIN
	SET a=a*2;
	SET b=b*2;
END $

#調用
SET @m=10$
SET @n=20$
CALL myp8(@m,@n)$
SELECT @m,@n$


#三、刪除存儲過程
#語法:drop procedure 存儲過程名
DROP PROCEDURE p1;
DROP PROCEDURE p2,p3;

#四、查看存儲過程的信息
DESC myp2;×
SHOW CREATE PROCEDURE  myp2;

函數

  • 含義:一組預先編譯好的SQL語句的集合,理解成批處理語句

  • 好處:

    • 提高代碼的重用性
    • 簡化操作
    • 減少了編譯次數並且減少了和數據庫服務器的連接次數,提高了效率
  • 區別

    • 存儲過程:可以有0個返回,也可以有多個返回,適合做批量插入、批量更新
    • 函數:有且僅有1 個返回,適合做處理數據後返回一個結果
  • 創建語法

    CREATE FUNCTION 函數名(參數列表) RETURNS 返回類型
    BEGIN
    函數體
    END

    注意:

    參數列表包含兩部分:參數名 參數類型

    函數體:肯定會有return語句,如果沒有會報錯

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

#函數
#1.無參有返回
#案例:返回公司的員工個數
CREATE FUNCTION myf1() RETURNS INT
BEGIN

	DECLARE c INT DEFAULT 0;#定義局部變量
	SELECT COUNT(*) INTO c#賦值
	FROM employees;
	RETURN c;
	
END $

SELECT myf1()$


#2.有參有返回
#案例1:根據員工名,返回它的工資

CREATE FUNCTION myf2(empName VARCHAR(20)) RETURNS DOUBLE
BEGIN
	SET @sal=0;#定義用戶變量 
	SELECT salary INTO @sal   #賦值
	FROM employees
	WHERE last_name = empName;
	
	RETURN @sal;
END $

SELECT myf2('k_ing') $

#案例2:根據部門名,返回該部門的平均工資

CREATE FUNCTION myf3(deptName VARCHAR(20)) RETURNS DOUBLE
BEGIN
	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 myf3('IT')$

#三、查看函數

SHOW CREATE FUNCTION myf3;

#四、刪除函數
DROP FUNCTION myf3;

#案例
#一、創建函數,實現傳入兩個float,返回二者之和

CREATE FUNCTION test_fun1(num1 FLOAT,num2 FLOAT) RETURNS FLOAT
BEGIN
	DECLARE SUM FLOAT DEFAULT 0;
	SET SUM=num1+num2;
	RETURN SUM;
END $

SELECT test_fun1(1,2)$
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章