補充:增刪查改語句在數據庫中基本通用,但這篇博客的內容基本是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)$
注意:因爲沒有返回值,所以使用存儲過程實現。