N年沒寫過存儲過程了,突然要寫存儲一下都忘記完了,現在回顧總結。
先廢話的說下mysql中的變量有1.系統變量 和 2.自定義變量
-
系統變量:變量由系統提供,不是用戶定義,屬於服務器層面
a.查看所有的系統變量: show global | session variables;
b.查看滿足條件的部分系統變量: show global | 【session】 variables like '%char%';
c.查看指定的某哥系統變量的值:
select @@global | 【session】.系統變量名;
d.爲某個系統變量賦值
方法一:
set global | 【session】 系統變量名 = 值;
方法二:
set @@global | 【session】.系統變量名 = 值;
e.全局變量
1.查看所有的全局變量:
SHOW GLOBAL VARIABLES;- 查看部分的全局變量:
SHOW GLOBAL VARIABLES LIKE '%char%';
3.查看指定的全局變量的值:
SELECT @@global.autocommit;
SELECT @@tx_isolation;
4.爲某個指定的全局變量賦值:
SET @@global.autocommit=0;
f.會話變量
1.查看所有的會話變量
SHOW VARIABLES;
SHOW SESSION VARIABLES;
2.查看部分的會話變量
SHOW VARIABLES LIKE '%char%';
SHOW SESSION VARIABLES LIKE '%char%';
3.查看指定的某個會話變量
SELECT @@tx_isolation;
SELECT @@session.tx_isolation;
4.爲某個會話變量賦值
方式一:
SET @@tx_isolation='read-uncommitted';
方式二:
SET SESSION tx_isolation='read-committed';
- 查看部分的全局變量:
- 自定義變量: 變量是用戶自定義的,不是系統的
作用域: 針對於當前會話(連接)有效,同於會話變量的作用域。應用在任何 地方,也就是begin end裏面或begin end外面
2.1用戶變量
賦值的操作符: = 或 :=
a.聲明並初始化
SET @用戶變量名=值;
或 SET @用戶變量名:=值;
或 SELECT @用戶變量名:=值
b.賦值(更新用戶變量的值)
方式一: 通過SET 或 SELECT
SET @用戶變量名=值;
或 SET @用戶變量名:=值;
或 SELECT @用戶變量名:=值;
方式二: 通過SELECT INTO
SELECT 字段 INTO @變量名 FROM 表;
c.使用(查看用戶變量的值)
SELECT @用戶變量名;
例子:
#聲明並初始化
SET @name='john';
SET @name=100;
SET @count=1;
#賦值
SELECT COUNT( * ) INTO @count FROM 表名
#查看
SELECT @count;
2.2 局部變量
作用域: 僅僅在定義它的begin end 中有效,應用在begin end中的第一句 話
a.聲明
DECLARE 變量名 類型;
DECLARE 變量名 類型 DEFAULT 值;
b.賦值
方式一: 通過SET 或 SELECT
SET 局部變量名=值;
或 SET 局部變量名:=值;
或 SELECT @局部變量名:=值;
方式二: 通過SELECT INTO
SELECT 字段 INTO 局部變量名 FROM 表
c.使用
SELECT 局部變量名;
對比用戶變量和局部變量
用戶變量:
作用域: 當前會話
定義和使用的位置: 會話中的任何地方
語法: 必須加@符合,不用限定類型
局部變量:
作用域: BEGIN END中
定義和使用的位置: 只能在BEGIN END中,且爲第一句話
語法: 一般不用加@符合,需要限定類型
例如: 聲明兩個變量並賦初始值,求和,並打印
SET @m=1;
SET @n=2;
SET @sum = @m + @n;
SELECT @sum;
存儲過程:
使用存儲過程的好處: 1.提高代碼的重用性; 2.簡化操作; 3.減少了編譯次數並減少了和數據庫服務器的連接次數,提高了效率
含義: 一組預先編譯好的SQL語句的集合,理解成批處理語句
一. 創建語法:
CREATE PROCEDURE 存儲過程名(參數列表)
BEGIN
存儲過程體(一組合法的SQL語句)
END
注意: 1.參數列表包含三部分:參數模式(IN、OUT、INOUT) , 參數名,參數類型
例如: IN stuname VARCHAR(20)
參數模式:
IN:該參數可以作爲輸入,也就是該參數需要調用方法入值
OUT:該參數可以作爲輸出,也就是該參數可以作爲返回值
INOUT:該參數即可以作爲輸入又可以作爲輸出,也就是該參數即需要傳入 值,又可以返回值
2.如果存儲過程體僅僅只有一句話,BEGIN END可以省略
存儲過程體中的每條SQL語句的結尾要求必須加分號。
存儲過程的結尾可以使用DELMITER重新設置,語法:
DELIMITER 結束標記
例如: DELIMITER $
二.調用語句
CALL 存儲過程名(實參列表);
例如:
1.空參列表
#例:插入到admin表中五個記錄
DELIMITER $
CREATE PROCEDURE myp1()
BEGIN
INSERT INTO admin(username, password)
VALUES('name1','1111'),('name2','1111'),('name3','1111'),('name4','1111'),('name5','1111');
END $
調用: CALL myp1() $
2.創建帶IN模式參數的存儲過程
例如: 創建存儲過程實現 根據名字查詢對應的信息
CREATE PROCEDURE myp2(IN beautyName VARCHAR(20))
BEGIN
SELECT tb1.*
FROM table1 tb1
RIGHT JOIN table2 tb2 on tb1.id = tb2.nameId
WHERE tb1.name = tb2.name
END $
調用: CALL myp2('姓名') $
例如:創建存儲過程實現,用戶是否登陸成功
CREATE PROCEDURE myp3(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('name','password') $
3.帶返回值的
例如:根據gril姓名,返回對應的boy姓名
CREATE PROCEDURE myp5(IN grilName VARCHAR(20), OUT boyName VARCHAR(20))
BEGIN
SELECT b.boyName INTO boyName
FROM boys b
INNER JOIN gril g ON b.id = g.boy_id
WHERE g.name = grilName;
END $
調用: CALL myp5('name', @bName) $
輸出: SELECT @bName$
例如: 根據gril姓名,返回對應的boy的姓名和魅力值
CREATE PROCEDURE myp6(IN gName VARCHAR(20), OUT bName VARCHAR(20), OUT bCp INT)
BEGIN
SELECT b.boyname, b.userCp INTO bName, bCp
FROM boys b
INNER JOIN gril g on b.id = g.boy_id
WHERE g.name = gName
END $
調用: CALL myp6(‘name’, @bName, @usercp)$
輸出: SELECT @bName, @usercp
4.創建帶INOUT模式參數的存儲過程
例如: 傳入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
#一、創建存儲過程實現傳入用戶名和密碼,插入到admin表中
CREATE PROCEDURE test_pro1(IN username VARCHAR(20), IN loginPwd VARCHAR(20))
BEGIN
INSERT INTO admin(admin.username, admin.password)
VALUES(username, loginPwd);
END $
#二、創建存儲過程實現傳入女神編號,返回女神名稱和女神電話
CREATE PROCEDURE test_pro2(IN id INT, OUT name VARCHAR(20), OUT phone VARCHAR(20))
BEGIN
SELECT b.name, b.phone INTO name,phone
FROM gril b
WHERE b.id = id
END $
#三、創建存儲過程實現傳入兩個生日,返回大小
CREATE PROCEDURE test_pro3(IN birth1 DATETIME, IN birth2 DATETIME, OUT result INT)
BEGIN
SELECT DATEDIFF(birth1, birth2) INTO result;
END $
#四、創建存儲過程實現傳入一個日期,格式化成爲YYYY年MM月DD日並返回
CREATE PROCEDURE test_pro4(IN mydate DATETIME, OUT strDate VARCHAR(50))
BEGIN
SELECT DATE_FORMAT(mydate, '%y年%m月%d日') INTO strDate;
END $
CALL test_pro4(NOW(), @str)$
SELECT @str $
#五、創建存儲過程實現分頁的效果
CREATE PROCEDURE test_pro6(IN startIndex INT, IN size INT)
BEGIN
SELECT * FROM admin LIMIT startIndex, size;
END $
3.刪除存儲過程
語法: DROP PROCEDURE 存儲過程名
![](https://s1.51cto.com/images/blog/201912/11/0dd990e41b7c87c4d79badb99502788b.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
4.查看存儲過程
SHOW CREATE PROCEDURE 存儲名稱;
函數:
函數和存儲過程的區別:
存儲過程:可以有0個返回,也可以有多個返回,適合做批量插入、批量更新
函數:有且僅有1個返回,適合做處理數據後返回一個結果
一、創建語法
CREATE FUNCTION 函數名(參數列表) RETURNS 返回類型
BEGIN
函數體
END
注意:
1.參數列表 包含兩個部分:參數名 參數類型
2.函數體:肯定會有return語句,如果沒有會報錯
如果return語句沒有放在函數體的最後也不報錯,不建議
return 值;
3.函數體中僅有一句話,則可以省略BEGIN END
4.使用DELIMITER語句設置結束標記
二、調用語法
SELECT 函數名(參數列表)
例如:
#1.無參有返回
CREATE FUNCTION my1() RETURNS INT
BEGIN
DECLARE c INT DEFAULT 0; #定義變量
SELECT COUNT(*) INTO c; #賦值
FROM employees;
RETURN c;
END $
調用: SELECT myf1()$
#2.有參有返回
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') $
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 函數名;
三、刪除函數
DROP FUNCTION 函數名;