1. 程式人生 > 實用技巧 >MySQL基礎-22儲存過程和函式

MySQL基礎-22儲存過程和函式

宣告:此MySQL基礎學習源自尚矽谷。(推薦)b站官方連結:https://www.bilibili.com/video/BV1xW411u7ax?p=1

儲存過程和函式

儲存過程和函式:類似java中的方法
好處:
1.提高程式碼的重用性
2.簡化操作

儲存過程

含義:
一組預先編譯好的SQL語句的集合,理解成批處理語句。
好處:
1.提高程式碼的重用性
2.簡化操作
3.減少了編譯次數,並且減少了和資料庫伺服器連線次數,提高了效率。

procedure /prəˈ siː dʒə(r)/ 過程,步驟

1.建立語法

create procedure 儲存過程名(引數列表)
begin
	儲存過程體 (一組合法的SQL語句)
end

注意:

1.引數列表包含三部分
引數模式、引數名、引數型別

舉例:
in stuname varchar(20) # 預設是in
-- 引數模式
in:該引數可以作為輸入,也就是該引數需要呼叫方傳入值
out:該引數可以作為輸出,也就是該引數可以作為返回值
inout:該引數既可以作為輸入又可以作為輸出,也就是該引數既需要傳入值,又可以返回值
2.如果儲存過程體僅僅只有一句話,begin end可以省略
3.儲存過程體中每條SQL語句的結尾要求必須加分號
4.儲存過程的結尾可以使用DELIMITER重新設定
	語法:
	DELIMITER 結束標記 
	eg:	DELIMITER $ # 不要寫分號結束

DELIMITER設定結束標記後,其他語句都要用這個設定的結束標記

2.呼叫語法

CALL 儲存過程名(實參列表);

1.空參列表

案例:插入到admin表中五條記錄

-- 設定結束標記,注意:設定結束標記後面不要寫分號,設定結束標記是所有語句都要用設定的這個結束標記,並不是只設置給儲存過程使用的,其他語句執行也要用這個結束標記,才能結束語句。
DELIMITER $
CREATE PROCEDURE myp1()
begin
	insert into admin(`username`,`password`) values
	('zhangsan','001'),
	('lisi','002'),
	('wangwu','003'),
	('zhaoliu','004'),
	('taoqi','005');
	
end $ # $表示儲存過程結束

-- 不能在資料庫管理工具中執行,需要cmd連線資料庫執行。

2.建立帶in模式引數的儲存過程

案例1:建立儲存過程實現 根據女神名,查詢對應的男神資訊

delimiter $
create 	procedure myp2(in beautyName varchar(20))
begin 
	select * from boys bo right join beauty b on bo.id = b.boyfriend_id 
	where b.name = beautyName;
end $
call myp2("蒼老師")$

案例2:建立儲存過程實現,使用者是否登入成功

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 $

3.建立帶out模式的儲存過程

案例1:根據女神名,返回對應男神名

create procedure myp5(in beautyName varchar(20), out boyName varchar(20))
begin
	select b.boyName into boyName # 查詢得到結果賦值給返回引數boyName
	from beauty be right join boys b on be.boyfriend_id = b.id 
	where be.name = beautyName;
end $
call myp5('小昭',@bName)$
select @bName$

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

create procedure myp6(in beautyName varchar(20),out boyName varchar(20),out userCP int)
begin
	select b.boyName,b.userCP into boyName,userCP 
	from beauty be right join boys b on b.id = be.boyfriend_id
	where be.name = beautyName;
end $

4.建立帶inout模式引數的儲存過程

案例:傳入a和b兩個值,最終a和b的值都翻倍並返回

create procedure myp7(inout a int,inout b int)
begin
	set a=a*2;
	set b=b*2;
end $
set @m=10$
set @n=20$

call myp7(@m,@n)$
select @m,@n$

3.儲存過程刪除

語法:
	drop procedure 儲存過程名;

-- 不支援一次刪除多個儲存過程
drop procedure 儲存過程1,儲存過程2; # 執行錯誤

4.檢視儲存過程的資訊

show create procedure 儲存過程名;

-- 不能修改儲存過程內的邏輯語句
-- 可以刪除儲存過程重新建立

函式

函式與儲存過程的區別:
儲存過程:可以有0個返回,也可以有多個返回,適合做批量插入,批量更新。
函式:有且僅有1個返回,適合做處理資料後返回一個結果

1.建立語法

create function 函式名(引數列表) returns 返回型別
begin 
	函式體
end
注意:
1.引數列表包含兩部分
引數名 引數型別

2.函式體:肯定會有return語句,如果沒有會報錯。
如果return語句沒有放在函式體的最後也不報錯,但不建議。
return 值;

3.函式體中僅有一句話,則可以省略begin end

4.使用delimiter語句設定結束標記

2.呼叫語法

select 函式名(引數列表)

1.無參有返回

案例:返回公司的員工個數

delimiter $
create function myf1() returns int
begin
	-- 定義一個變數返回
	declare c int default 0; # 定義區域性變數
	select count(*) into c # 變數賦值
	from employees;
	retrun 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('kochhar') $

案例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') $

3.檢視函式

show create function myf2;

在資料庫的mysql庫中的proc表可以看到定義的儲存過程和函式

4.刪除函式

drop function myf2;

案例:建立函式,實現傳入兩個float,返回二者之和

create function myf3(num1 float,num2 float) return float
begin
	declare sum float default 0;
	set sum=num1+num2;
	
	return sum;
end $
select myf3(1.3,4.5)$