存儲過程和函數
一、存儲過程
變量
用戶變量
- 作用域:針對於當前會話(連接)有效,作用域同於會話變量
- 賦值操作符:=或:=
- 聲明賦值語法: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)$