(八)MySQL事務、視圖、變量、存儲過程、函數、流程控制結構

補充:增刪查改語句在數據庫中基本通用,但這篇博客的內容基本是MySQL區別於其它數據庫管理系統的知識,也要認真學習。

一、事務

1、含義:在MySQL中,可以通過創建事務來解決一些問題。

2、語法:

#1、開啓事務
set autocommit=0; #禁用自動提交功能
#2、編寫事務的sql語句
select insert update delete...
#3、結束事務
commit;提交事務
rollback;回滾事務

注意:MySQL默認提交事務,所以要先將autocommit功能禁用。

案例1:模擬張飛給劉備轉賬這一事件

查詢數據庫:

模擬轉賬:

SET AUTOCOMMIT=0;
UPDATE bank b
SET b.money=b.money-500
WHERE b.name='張飛';
UPDATE bank b
SET b.money=b.money+500
WHERE b.name='劉備';

轉賬後結果:

重新打開一個新標籤,重新查詢bank表中的內容:

可以看出數據庫中的數據並未改變,因爲前一個標籤修改後還沒有提交。

輸入rollback,在第一個標籤中再次查看錶中數據:

可以看出rollback的作用是將數據恢復到上次提交之後的數據庫內容。

案例2:savepoint 設置保存點

SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=25;
SAVEPOINT a;
DELETE FROM account WHERE id=28;
ROLLBACK TO a;

注意:保存點一定要起別名,便於和rollback搭配使用。

3、事務的隔離級別

                    髒讀  不可重複讀   幻讀
read uncommitted:   √       √       √
read committed:     ×       √       √
repeatable read:    ×       ×       √
serializable:       ×       ×       ×

注意:

①mysql中默認 第三個隔離級別 repeatable read

②查看隔離級別:select @@tx_isolation;

③設置隔離級別:set session|global transaction isolation level 隔離級別;

4、各名詞含義:

①髒讀:其他人看到了更改的數據後,數據被滾回

②不可重複讀:數據被滾回之後再次讀取數值不同

③幻讀:第一次查詢數據爲三條,在查詢後數據條數被其他人更改,再次查詢時數據條數與之前不同

二、視圖

1、含義:視圖是虛擬創建的表,不在庫中真實存在,一般是將多個表中的數據合併在一個表中,便於以後直接對其操作。

2、創建視圖:

案例:查詢張姓學生的學生名和專業名

step1:新建視圖v1,並將學生名和專業名存放在其中

CREATE VIEW v1 #先創建視圖
AS
SELECT stuname,majorname
FROM stuinfo s
INNER JOIN major m ON s.`majorid`= m.`id`;

注意:創建好的視圖在SQLyog中顯示位置如下:

step2:對創建好的視圖進行操作,從中篩選符合條件的數據

SELECT * FROM v1 WHERE stuname LIKE '張%';

2、修改視圖(重新創建一個新視圖):

語法:

CREATE OR REPLACE v1
AS
查詢語句;

3、刪除視圖:

DROP VIEW myv1,myv2;

注意:可同時刪除多個視圖。

4、查看視圖:

DESC v1;
SHOW CREATE VIEW v1;

5、更新視圖中的數據:

#1.插入
INSERT INTO myv1 VALUES('張飛','[email protected]');
#2.修改
UPDATE myv1 SET last_name = '張無忌' WHERE last_name='張飛';
#3.刪除
DELETE FROM myv1 WHERE last_name = '張無忌';

注意:視圖數據的修改與表的修改相似,只需將table替換爲view即可,但具備以下性質的視圖不可被修改:

①包含以下關鍵字:分組函數、distinct、group  by、having、union或者union all
②常量視圖
③Select中包含子查詢
④join
⑤from一個不能更新的視圖
⑥where子句的子查詢引用了from子句中的表

三、變量

1、分類:

系統變量
    全局變量(global)
    會話變量(session)
自定義變量
    用戶變量
    局部變量

2、系統變量

①全局變量(所有會話均有效,但數據庫重啓後消失):

#案例一:查看所有的全局變量
SHOW GLOBAL VARIABLES;  
#案例二:查看部分全局變量
SHOW GLOBAL VARIABLES LIKE '%char%';
#案例三:查看指定全局變量
SELECT @@global.autocommit;
#案例四:修改某個全局變量
SET @@global.autocommit=0;

②會話變量(僅對本次會話有效)

注意:其查看、修改與全局變量相似,只需要將global替換爲session

3、自定義變量

①用戶變量(作用域同會話變量):

#聲明並初始化 
SET @變量名=值;
#賦值(更新變量的值) #方式很多,僅舉其一
SET @變量名=值;	
#使用(查看變量的值)
SELECT @變量名;

②局部變量(僅在begin end中使用):

#聲明
DECLARE 變量名 類型; 或
DECLARE 變量名 類型 【DEFAULT 值】;
#賦值(更新變量的值)
SET 局部變量名=值;
#使用(查看變量的值)
SELECT 局部變量名;

案例:聲明兩個用戶變量,求和並打印

SET @n=6,@m=3;
SET @sum=@n*@m;
SELECT @sum;

四、存儲過程

1、含義:將一組合法的SQL語句封裝在一起構成存儲過,程類似函數但存在區別。

2、創建語法:

CREATE PROCEDURE 存儲過程名(參數列表)
BEGIN
	存儲過程體(一組合法的SQL語句)
END

存儲過程創建後在SQLyog中位置:

注意:

①參數列表包含:參數模式,參數名,參數類型。

②參數模式:in(輸入)、out(輸出)、inout(即可輸入也可輸出)

③如果存儲過程體僅僅只有一句話,begin end可省略。

④SQL語句結尾要添加分號,存儲過程結尾也要使用結束符號,結束符號要使用delimiter自定義

delimiter $

案例1:創建一個作用爲向admin中插入一條新記錄的存儲過程(不使用參數模式)

DELIMITER $
CREATE PROCEDURE ins()
BEGIN
	INSERT INTO admin(username,PASSWORD) 
	VALUES('Cindy',666666);
END$

調用:

CALL ins()$

注意:調用的 時候以$結尾因爲創建存儲過程前將結束語句修改爲了$。

案例2:創建存儲過程實現根據女生名,查詢對應的男神信息(使用參數模式IN)

CREATE PROCEDURE cre(IN girl_name VARCHAR(20))
BEGIN
	SELECT bo.boyName
	FROM boys bo
	INNER JOIN beauty b ON bo.id=b.boyfriend_id
	WHERE b.name=girl_name;
END$

查詢:

CALL rel('關曉彤')$

運行結果:

案例3:傳入a和b兩個值,最終a和b都翻倍並返回(參數中包含INOUT)

CREATE PROCEDURE my_6(INOUT a INT,INOUT b INT)
BEGIN
	SET a=a*2;
	SET b=b*2;
END$

查詢:

SET @m=5,@n=6$
CALL my_6(@m,@n)$
SELECT @m,@n$

注意:由於參數a、b即作爲參數,也作爲返回值,所以要先定義變量便於查詢其返回值。

3、刪除存儲過程:

DROP PROCEDURE 存儲過程名;

4、查看存儲過程:

SHOW CREATE PROCEDURE 存儲過程名;

五、函數

1、與存儲過程的區別:函數有且僅有一個返回值,存儲過程無要求。

2、創建語法:

CREATE FUNCTION 函數名(參數列表) RETURNS 返回類型
BEGIN
	函數體
END

注意:

①參數列表包含變量名和變量類型

②函數體中必須要包含return

③begin end的用法和存儲過程相同

函數創建後再SQLyog中的位置:

3、調用語法:

SELECT 函數名(參數);

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

#創建函數
DELIMITER $
CREATE FUNCTION counts() RETURNS INT 
BEGIN
	SET @num=0; #注意分號的使用
	SELECT COUNT(*) INTO @num
	FROM employees;
	RETURN @num;
END$
#調用函數
SELECT counts();

注意:

①函數的創建語法與存儲過程的創建語法不同,使用returns。

②MySQL8.0版本創建函數時報錯,解決方法如下:點擊訪問 

4、查看、刪除語法與存儲過程相似,將procedure修改爲function即可。

六、流程控制結構

1、if結構(if函數)

if 條件1 then 語句1;
elseif 條件2 then 語句2;
....
else 語句n;
end if;

注意:if結構只能用在begin end中

2、循環結構:while、loop、repeat

①循環控制:

  iterate類似於 continue,繼續,結束本次循環,繼續下一次 ​

  leave 類似於 break,跳出,結束當前所在的循環

②語法:

#1.while
【標籤:】while 循環條件 do
    循環體;
end while【 標籤】;
#2.loop
【標籤:】loop
    循環體;
end loop 【標籤】;
#3.repeat
【標籤:】repeat
    循環體;
until 結束循環的條件
end repeat 【標籤】;

案例:批量插入,根據次數插入到admin表中多條記錄

DROP PROCEDURE pro_while1$
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN
	DECLARE i INT DEFAULT 1;
	WHILE i<=insertCount DO
		INSERT INTO admin(username,`password`) VALUES(CONCAT('Rose',i),'666');
		SET i=i+1;
	END WHILE;
	
END $

調用:

SELECT pro_while1(100)$

注意:因爲沒有返回值,所以使用存儲過程實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章