MySQL基礎-22儲存過程和函式
阿新 • • 發佈:2020-07-21
宣告:此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)$