MySQL數據庫技術
十三、變量
1.分類
系統變量:全局變量和會話變量
自定義變量:用戶變量和局部變量
2.系統變量
由MySQL系統給我們提供的,不是用戶定義的,屬於服務器層面的應用
-- 全局變量
-- 查看所有的全局變量
SHOW GLOBAL VARIABLES;
-- 查看部分全局變量
SHOW GLOBAL VARIABLES LIKE '%char%';
-- 查看指定的全局變量
SELECT @@global.autocommit;
-- 爲某個指定的全局變量賦值
SET @@global.autocommit=0;
-- 全局變量的作用域
-- 針對所有的會話(連接),只有服務器重新啓動將會把所有的全局變量賦默認值,如果想跨啓動,只有修改MYSQL的配置文件,不建議修改
--會話變量
-- 作用域只針對當前會話(連接)是有效的,與全局變量的區別
-- 查看所有的會話變量
SHOW SESSION VARIABLES;-- session 可以省略,默認會話變量
-- 查看部分會話變量
SHOW SESSION VARIABLES LIKE '%char%';
-- 查看指定的會話變量
SELECT @@session.autocommit;
SELECT @@autocommit;
-- 爲某個指定的會話變量賦值
SET @@session.autocommit=0;
3.自定義變量
由用戶定義的變量,不是mysql系統提供的
先聲明,再賦值,後使用
-- 語法:
set @用戶變量名 = 值;
set @用戶變量名 := 值;
select @用戶變量名 := 值;
-- 聲明並初始化用戶變量
SET @name = '張三';
-- 賦值
-- 方式一:SET @用戶變量名 = 值;
SET @name='李四';
-- 方式二: select 字段 into @name from 表
SELECT COUNT(*) INTO @name FROM student;
-- 使用用戶變量 -查看
SELECT @name;
-- 局部變量
-- 作用域:僅僅在定義它的begin end中有效,應用在begin end中,而且必須放在第一句
-- 聲明
declare 變量名 類型;
declare 變量名 類型 default 值:;
-- 賦值
-- 方式一:SET 局部變量名 = 值;
-- 方式二: select 字段 into 局部變量名 from 表
-- 查看
SELECT 局部變量名;
作用域 | 定義和使用位置 | 語法 | |
---|---|---|---|
用戶變量 | 當前會話 | 會話中的任何地方 | 必須使用@符合,不用類型限定 |
局部變量 | begin end 中 | 只能在begin end中,且爲第一句 | 一般不用加@符號,需要限定類型 |
十四、存儲過程和函數
類似於在java中學到的方法
1.存儲過程和函數的好處
- 提高代碼的重用性
- 簡化了sql操作
- 減少了編譯次數,提高開發效率[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-YzApFMkd-1608454319982)(C:\Users\24582\AppData\Roaming\Typora\typora-user-images\image-20201220143015161.png)]
2.存儲過程
一組預先編譯好的sql語句的集合,理解錯批處理語句
創建語法
create procedure 存儲過程名(參數列表)
begin
存儲過程體(一組合法的sql語句)
end;
-- 注意:參數列表包含了三部分: 參數模式,參數名,參數類型
-- 參數模式: in/out/inout sname varchar(20);
-- in:輸入值,調用傳入的值
-- out:輸出參數,可以最爲返回值來用
-- inout:既需要傳入值,又可以返回值
delimiter 設置結束標識符
delimiter $
調用語法
call 存儲過程名(實參列表)
實際操作
編寫一個存儲過程,該過程可以向表中添加記錄
-- 創建測試表
create table mytest(
id int primary key auto_increment,
sname varchar(50),
spwd varchar(50),
)
-- 創建存儲過程
DELIMITER $
create procedure myp1()
begin
insert into mytest(sname,spwd) values('admin','123456'),('趙四','123789');
end;$
-- 調用存儲過程
call myp1();
-- 刪除存儲過程
drop procedure myp1;
創建帶有in模式參數的存儲過程
1.編寫一個存儲過程,需要輸入學生名,查詢該學生對應的班級名稱
DELIMITER $
create procedure myp2(in myname varchar(30)) -- in可以不寫,默認
begin
select c.cname,s.sname
from student s join class c on s.cno=c.cno and s.sname = myname;
end;$
CALL myp2('tom');
2.創建存儲過程,實現用戶登錄功能(多個參數,用戶名,密碼)
DELIMITER $
create procedure myp3(in mname varchar(30),in mpass varchar(30))
begin
-- 聲明局部變量,初始化
declare result varchar(20) default '';
select count(*) into result
from mytest m where m.sname=mname and m.spwd = mpass
select result;-- 登錄成功返回1,失敗返回0
end;$
CALL myp3('admin','123456');
創建帶有out模式參數的存儲過程
1.通過學生編號,返回對應的班級名稱;(輸入參數,一個返回值)
DELIMITER $
CREATE PROCEDURE myp4(IN myid VARCHAR(20),OUT mclassname VARCHAR(20))
BEGIN
SELECT c.cname INTO mclassname
FROM student s,class c WHERE s.cno=c.cno AND s.sno=myid;
END;$
CALL myp4('1805',@cname) -- 用自定義變量接收
SELECT @cname;-- 查詢自定義變量
2.通過學生編號,返回對應的班級名稱,學生姓名;(輸入參數,二個返回值)
DELIMITER $
CREATE PROCEDURE myp5(IN myid VARCHAR(20),OUT mclassname VARCHAR(20),msname varchar(20))
BEGIN
SELECT c.cname,s.sname INTO mclassname,msname
FROM student s,class c WHERE s.cno=c.cno AND s.sno=myid;
END;$
CALL myp5('1805',@cname,@sname)
SELECT @cname,@sname;
創建帶有inout模式參數的存儲過程
-- 案例:傳入兩個數值,輸出返回這兩個數據的翻倍值
DELIMITER $
create procedure myp6(inout num1 int,inout num2 int)
begin
set num1 = num1 * 2;
set num2 = num2 * 2;
end;$
-- 調用
SET @m=10;
SET @n=5;
CALL myp6(@m,@n)
SELECT @m,@n;
3.查看存儲過程信息
show create procedure myp6;
-- 注意點:存儲過程沒用修改操作,要麼只能重新創建方式
4.練習
-- 創建存儲過程實現傳入一個日期,格式化成xx年xx月xx日方式返回
DELIMITER $
CREATE PROCEDURE myp7(IN mDate DATETIME,OUT sDate VARCHAR(50))
BEGIN
SELECT DATE_FORMAT(mDate,'%Y年%m月%d日') INTO sDate;
END;$
-- 調用
CALL myp7(NOW(),@time); -- 輸入當前時間
SELECT @time;
-- 創建分頁的存儲過程,傳入起始索引和每頁顯示的大小,查詢出數據並返回
DELIMITER $
CREATE PROCEDURE myp8(IN startindex INT, IN size INT)
BEGIN
SELECT * FROM student LIMIT startindex,size;
END;$
-- 調用
CALL myp8(0,3)
CALL myp8(3,3)
十五、函數
一組預先編譯好的sql語句的集合,理解錯批處理語句
1.與存儲過程的區別
函數和存儲過程功能可以相同,一樣的,主要看研究他們的區別:
存儲過程:可以沒有返回值,也可以有多個返回值,適合做批量插入、批量更新上;
函數:有且僅有一個返回值,適合做處理數據後的返回結果(一個)
2.創建方法
create function 函數名(參數列表) returns 返回類型
begin
函數體
end
-- 注意:
--:參數列表包含兩個部分:參數名,參數類型
-- 函數體:肯定會有return 語句,沒有會報錯
-- 調用語法
select 函數名(參數列表);
3.案例操作
-- 案例:返回學生表的學生個數
DELIMITER $
CREATE FUNCTION myf1() RETURNS INT
BEGIN
DECLARE c INT DEFAULT 0;-- 定義局部變量
SELECT COUNT(*) INTO c FROM student;
RETURN c;
END;$
-- 調用
SELECT myf1();
-- 案例:根據學生名,返回學生成績
DELIMITER $
CREATE FUNCTION myf2(myname VARCHAR(20)) RETURNS DOUBLE
BEGIN
SET @score = 0;
SELECT student.score INTO @score
FROM student WHERE student.sname=myname;
RETURN @score;
END;$
-- 調用
SELECT myf2('tom');
-- 案例:根據班級名稱,返回該班級的平均成績
DELIMITER $
CREATE FUNCTION myf3(classname VARCHAR(30)) RETURNS DOUBLE
BEGIN
SET @avgscore = 0;
SELECT AVG(s.score) INTO @avgscore
FROM student s,class c WHERE c.cno = s.cno AND c.cname=classname;
RETURN @avgscore;
END;$
-- 調用
SELECT myf3('classtwo');
4.查看函數
show create function 函數名稱;
5.刪除函數
drop function 函數名;
-- 和存儲過程一樣都沒有修改過程