從0基礎學習MySQL數據庫(四)

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 函數名;
-- 和存儲過程一樣都沒有修改過程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章