MySQL高级篇(事务视图存储过程与函数)
目錄
一.事務(wù)
1.1什么是事務(wù)?
1.2事務(wù)的特性
1.3事務(wù)的分類
1.4事務(wù)的操作步驟
1.5事務(wù)的隔離級別(面試題常考)
二.視圖
2.1視圖的操作
2.1.1視圖的創(chuàng)建
2.1.2視圖更新(一般不能更新)
2.1.3視圖的刪除
2.1.4視圖的查看
三.變量
3.1用戶變量
3.2局部變量
四.存儲(chǔ)過程
4.1創(chuàng)建語法
4.2調(diào)用語法
4.3存儲(chǔ)過程實(shí)例
4.4存儲(chǔ)過程刪除與查看
五.流程控制結(jié)構(gòu)
5.1分支結(jié)構(gòu)
5.1.1if函數(shù)
5.1.2case函數(shù)
5.1.3if結(jié)構(gòu)
5.2循環(huán)結(jié)構(gòu)
5.2.1loop循環(huán)
5.2.2repeat循環(huán)
5.2.3while循環(huán)
????????每個(gè)人就像是一個(gè)紙杯,知識、涵養(yǎng)像杯里的水。別人不會(huì)看到你杯子里的水,別人看到的只是溢出的那一點(diǎn)點(diǎn)。當(dāng)你內(nèi)涵溢出的時(shí)候,自然會(huì)被發(fā)現(xiàn)。
接觸MySQL已經(jīng)一個(gè)月了,今天終于接近尾聲。感覺MySQL學(xué)起來非常的枯燥,不過還好過了一遍,最后一個(gè)階段:MySQL高級篇。
一.事務(wù)
1.1什么是事務(wù)?
? ? ? ??Transaction Control Language 事務(wù)控制語言,一個(gè)或一組SQL語句組成一個(gè)執(zhí)行單元,這個(gè)執(zhí)行單元要么全部執(zhí)行,要么全部不執(zhí)行。
1.2事務(wù)的特性
? ? ? ? ①原子性:一個(gè)事務(wù)不可在分割,要么都執(zhí)行,要么都不執(zhí)行。
? ? ? ? ②一致性:一個(gè)事務(wù)執(zhí)行會(huì)使數(shù)據(jù)從一個(gè)一致狀態(tài)切換到另一個(gè)一致狀態(tài)。
? ? ? ? ③隔離性:一個(gè)事務(wù)的執(zhí)行不受其他事物的干擾。
? ? ? ? ④持久性:一個(gè)事務(wù)一旦提交,則會(huì)永久的改變數(shù)據(jù)庫的數(shù)據(jù)。
1.3事務(wù)的分類
????????隱式事務(wù):事務(wù)沒有明顯的開啟和結(jié)束的標(biāo)記。比如:insert,update,delete。
????????顯式事務(wù):事務(wù)有明顯的開啟和結(jié)束的標(biāo)記。前提:必須先設(shè)置自動(dòng)提交功能為禁用。
關(guān)掉自動(dòng)提交: set autocommit=0;1.4事務(wù)的操作步驟
? ? ?
1.開啟事務(wù) set autocommit=0; start transaction;【可選】2.編寫事務(wù)中的sql語句( insert、update、delete語句) 語句一; 語句二: ...3.結(jié)束事務(wù) commit:提交事務(wù) rollback:回滾事務(wù)注意:delete和truncate在事務(wù)使用時(shí)的區(qū)別 :
演示delete(支持回滾): SET autocommit=0; START TRANSACTION; DELETE FROM accout; ROLLBACK; ================================== 演示truncate(不支持回滾): SET autocommit=0; START TRANSACTION; TRUNCATE TABLE accout; ROLLBACK;1.5事務(wù)的隔離級別(面試題常考)
1.事務(wù)并發(fā)問題是如何產(chǎn)生的?
????????當(dāng)多個(gè)事務(wù)同時(shí)操作同一個(gè)數(shù)據(jù)庫的相同數(shù)據(jù)時(shí)。
2.?事務(wù)并發(fā)問題
????????臟讀:一個(gè)事務(wù)讀取到了另外一個(gè)事務(wù)未提交的數(shù)據(jù)。
????????不可重復(fù)讀:同一個(gè)事務(wù)中,多次讀取到的數(shù)據(jù)不一致。
?????????幻讀:一個(gè)事務(wù)讀取數(shù)據(jù)時(shí),另外一個(gè)事務(wù)進(jìn)行更新,導(dǎo)致第一個(gè)事務(wù)讀取到了沒有更新的數(shù)據(jù)。
3.處理事務(wù)并發(fā)問題,設(shè)置事務(wù)隔離級別
?????????READ UNCOMMITTED
????????READ COMMITTED:可以避免臟讀
????????REPEATABLE READ:可以避免臟讀、不可重復(fù)讀和一部分幻讀
????????SERIALIZABLE:可以避免臟讀、不可重復(fù)讀和幻讀
? ? ? ? 注意:隔離級別從小到大安全性越來越高,但是效率越來越低。
4.設(shè)置以及查看隔離級別
設(shè)置隔離級別: set session|global transaction isolation level 隔離級別名;查看隔離級別:select @@tx_isolation;二.視圖
? ? ? ? 視圖:一張?zhí)摂M的表。好處:sql語句提高重用性,效率高。和表實(shí)現(xiàn)了分離,提高了安全性
2.1視圖的操作
2.1.1視圖的創(chuàng)建
語法CREATE VIEW 視圖名AS 查詢語句; 示例CREATE VIEW myview as select * from user;2.1.2視圖更新(一般不能更新)
方式一 語法: create or replace view 視圖名 as 查詢語句 例: CREATE OR REPLACE VIEW myv1 AS SELECT AVG(salary),job_id FROM employees GROUP BY job_id;方式二 語法: alter view myv1 as 查詢語句 例:ALTER VIEW myv1 AS SELECT * FROM employees/* 包含以下關(guān)鍵字的SQL語句:分組函數(shù),distinct,group by,having,union all 常量視圖 */2.1.3視圖的刪除
語法: drop view 視圖名,視圖名,..... 例: DROP VIEW myv1,myv2.....2.1.4視圖的查看
語法:1.desc 視圖名(常用)2.show create view myv1例:DESC myv1; SHOW CREATE VIEW myv1;只是對視圖的操作,因?yàn)橐晥D本來就是一張表,所以同樣能對視圖中的數(shù)據(jù)進(jìn)行增刪改查,但值得注意的是:如果你對視圖中的數(shù)據(jù)進(jìn)行操作,那么原始表中的數(shù)據(jù)也會(huì)跟著變化。
三.變量
系統(tǒng)變量:
?? ?全局變量:global
作用域:服務(wù)器每次啟動(dòng)將為所有的全局變量附初始值,針對于所有的會(huì)話,但是不能跨重啟。?? ?
?? ?
?? ?會(huì)話變量:session(默認(rèn))
作用域:僅僅針對于當(dāng)前會(huì)話有效
?? ?
自定義變量:
?? ?用戶變量
?? ?局部變量
這里主要講解自定義變量,系統(tǒng)的變量大家自行去C一下。
3.1用戶變量
? ? ? ? 它的使用步驟:1.聲明,2.賦值,3.使用。它的作用域:當(dāng)前會(huì)話,也就是 begin end 里面外面都是可以的。
聲明并初始化三種方式:SET @用戶變量名=值;SET @用戶變量名:值;SELECT @用戶變量名:=值;賦值:方式一:通過SET或SELECT SET @用戶變量名=值; SET @用戶變量名:值; SELECT @用戶變量名:=值;方式二:通過SELECT INTO SELECT 字段 INTO 變量名 FROM 表查看:SELECT @用戶變量名案例: SET @count='0';SELECT COUNT(*) INTO @count FROM employees;SELECT @count; 結(jié)果是107。3.2局部變量
它的作用域:僅僅定義在他的begin end 中的第一句話。例子在存儲(chǔ)過程中會(huì)用到,這里就不介紹了。
①聲明: DECLARE 變量名 類型; 或 DECLARE 變量名 類型 DEFAULT 值;②賦值 方式一:通過SET或SELECT SET 局部變量名=值;SET 局部變量名:值;SELECT @局部變量名:=值;方式二:通過SELECT INTO SELECT 字段 INTO 局部變量名 FROM 表③使用SELECT 局部變量名四.存儲(chǔ)過程
存儲(chǔ)過程含義:一組預(yù)先編譯好的sql語句的集合,理解成批處理語句。類似于java中的方法。好處:1.提高代碼的重用性。2.簡化操作。3.減少了編譯次數(shù)和數(shù)據(jù)庫服務(wù)器的鏈接次數(shù),提高了效率。
4.1創(chuàng)建語法
CREATE PROCEDURE 存儲(chǔ)過程名(參數(shù)列表) BEGIN 存儲(chǔ)過程體 END注意:
參數(shù)列表包含三部分:參數(shù)模式,參數(shù)名,參數(shù)類型。
IN:該參數(shù)可以作為輸入,也就是該參數(shù)需要調(diào)用傳入值
OUT:該參數(shù)可以作為輸出,也就是該參數(shù)可以作為返回值
INOUT: 該參數(shù)可以作為輸入也可以作為輸出,也就是該參數(shù)既需要傳入值,又可以返回值
如果存儲(chǔ)過程體只有一句話,BEGIN END 可以省略,存儲(chǔ)過程體中的每條SQL語句的結(jié)尾要求必須加分號;存儲(chǔ)過程的結(jié)尾可以使用DELIMITER 重新設(shè)置
語法:
DELIMITER 結(jié)束標(biāo)記;
4.2調(diào)用語法
CALL 存儲(chǔ)過程名(實(shí)參列表);4.3存儲(chǔ)過程實(shí)例
1.空參列表 案例:插入到admin表中五條記錄 DELIMITER $;CREATE PROCEDURE myp1() BEGIN INSERT INTO admin(username,`password`) VALUES('join1','0000'),('join2','0000'),('join3','0000'),('join4','0000'),('join5','0000'); END $call myp1()$ =============================================================================== 2.創(chuàng)建帶in模式的存儲(chǔ)過程 案例1.創(chuàng)建存儲(chǔ)過程實(shí)現(xiàn),根據(jù)女神名,查詢對應(yīng)的男神信息DELIMITER $ CREATE PROCEDURE myp3(IN username VARCHAR(20),IN passwordq VARCHAR(20)) BEGIN DECLARE result INT DEFAULT 0;聲明并初始化SELECT COUNT(*) INTO result 賦值FROM `admin`WHERE `admin`.`username`=usernameAND `admin`.`password`=passwordq;SELECT IF(result>0,'成功','失敗'); 使用END $調(diào)用 CALL myp2('柳巖')$========================================================================== 3.創(chuàng)建帶out模式的存儲(chǔ)過程 #根據(jù)女神名,返回對應(yīng)的男神信息 DELIMITER $ CREATE PROCEDURE myp4(IN beautyName VARCHAR(20),OUT boyname VARCHAR(20)) BEGIN SELECT bo.`boyName` INTO boynameFROM boys boRIGHT JOIN beauty b ON bo.id=b.`boyfriend_id`WHERE b.name=beautyName;END $調(diào)用 CALL myp4('小昭',@bName)$ SELECT @bname$ =============================================================================4.創(chuàng)建帶input模式參數(shù)的存儲(chǔ)過程 案例:傳入a和b兩個(gè)值,最終a和b都能翻倍并返回 DELIMITER $ CREATE PROCEDURE myp6(INOUT a INT,INOUT b INT) BEGIN SET a=a*2;SET b=b*2; END $調(diào)用 SET @m=10$ SET @n=20$ CALL myp6(@m,@n)$ SELECT @m,@n$;4.4存儲(chǔ)過程刪除與查看
刪除: DROP PROCEDURE myp1查看: SHOW CREATE PROCEDURE myp2五.流程控制結(jié)構(gòu)
? ? ???????流程控制結(jié)構(gòu):1.順序結(jié)構(gòu):程序從上往下依次執(zhí)行。2.分支結(jié)構(gòu):程序從兩條路或者多條路中選擇一條。3.循環(huán)結(jié)構(gòu):程序在滿足一定條件的基礎(chǔ)上,重復(fù)執(zhí)行一段代碼。? ? 這里主要介紹后兩種。
5.1分支結(jié)構(gòu)
5.1.1if函數(shù)
功能:實(shí)現(xiàn)簡單的雙分支。語法:if(表達(dá)式1,表達(dá)式2,表達(dá)式3)
執(zhí)行順序:如果表達(dá)式1成立,則if函數(shù)返回表達(dá)式2的值,否則返回表達(dá)式3的值
應(yīng)用:任何地方。這種比較簡單,在前面博客中就有介紹,小伙伴可取查看,這里附上鏈接:MySQL進(jìn)階(分組查詢,多表連接查詢)_q1097528949的博客-CSDN博客
5.1.2case函數(shù)
情況一:類似于java中的switch語句,一般用于實(shí)現(xiàn)等值判斷
語法:case 變量|表達(dá)式|字段?
? ? ? when 要判斷的值 ?then 返回的值或語句;
? ? ? when 要判斷的值 ?then 返回的值或語句;
? ? ? ..........
? ? ? else 返回的值或語句;
? ? ? end case;?
情況二:類似于java中的多重if語句,一般用于實(shí)現(xiàn)區(qū)間判斷
語法:case ?
? ? ? when 要判斷的條件 ?then 返回的值或語句;
? ? ? when 要判斷的條件 ?then 返回的值或語句;
? ? ?...................
? ? ? else 返回的值或語句;
? ? ? end case;
?特點(diǎn):
?可以作為表達(dá)式,嵌套在其他語句中使用,可以放在任何地方,begin end 中或begin end 外
?可以作為獨(dú)立的語句去使用,只能放在begin end中
案例:
/*案例:創(chuàng)建存儲(chǔ)過程,根據(jù)傳入的成績,來顯示等級,比如傳入的成績:90-100,顯示A,80-90,顯示B,60-80,顯示C,否則顯示D。*/CREATE PROCEDURE test_case(IN score INT) BEGINCASEWHEN score>=90 THEN SELECT 'A';WHEN score>=80 THEN SELECT 'B';WHEN score>=60 THEN SELECT 'C';ELSE SELECT 'D'; END CASE; END$調(diào)用 CALL test_case(95)$5.1.3if結(jié)構(gòu)
功能:實(shí)現(xiàn)多重分支。語法:if 條件1 then 語句一;
else if 條件2 then 語句二;
........
【else if 語句;】
end if ;
應(yīng)用在begin end中
案例:
案例:根據(jù)傳入的成績,來顯示等級,比如傳入的成績:90-100,返回A,80-90,返回B,60-80,返回C,否則返回D。 DELIMITER $ CREATE FUNCTION test_if(score INT) RETURNS CHAR BEGINIF score>=90 AND score<=100 THEN RETURN 'A';ELSEIF score>=80 THEN RETURN 'B';ELSEIF score>=60 THEN RETURN 'C';ELSE RETURN 'D';END IF; END $#調(diào)用 SELECT test_if(86)$5.2循環(huán)結(jié)構(gòu)
????????分類:while,loop,repeat。循環(huán)控制:iterate類似于 countinue,結(jié)束本次循環(huán),繼續(xù)下一次
leave 類似于 break,跳出,結(jié)束當(dāng)前所在循環(huán)。這里還是為大家主要介紹while,while用的比較多。
5.2.1loop循環(huán)
??【標(biāo)簽:】loop
?? ?循環(huán)體;
?? ?end loop 【標(biāo)簽】
5.2.2repeat循環(huán)
【標(biāo)簽:】repeat?
? ? ? ?循環(huán)體;
? until 結(jié)束循環(huán)的條件
? ?end repeat【標(biāo)簽】;
5.2.3while循環(huán)
語法:
? ? ? 【標(biāo)簽:】while 循環(huán)條件 do?
?? ?循環(huán)體;
?? ?end while 【標(biāo)簽】;
1.沒有添加循環(huán)控制語句
案例:批量插入,根據(jù)次數(shù)插入到admin表中多條記錄
結(jié)果:
2.添加循環(huán)控制語句
案例:批量插入,根據(jù)次數(shù)插入到admin表中多條記錄leave
結(jié)果:
MySQL在這里就告一段落了,接下來就進(jìn)入JDBC的學(xué)習(xí)了。
這些年,我一直提醒自己一件事,千萬不要感動(dòng)自己。大多數(shù)人看似的努力,不過是愚蠢導(dǎo)致的。什么熬夜看書到天亮,連續(xù)幾天只睡幾個(gè)小時(shí),多久沒放假了,如果這些東西也值得夸耀,那么富士康流水線上的任何一個(gè)人都比你努力多了。人難免天生有自憐的情緒,唯有時(shí)刻保持清醒,才能看清真正的價(jià)值在哪里。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???——于宙《我們這一代人的困惑》
總結(jié)
以上是生活随笔為你收集整理的MySQL高级篇(事务视图存储过程与函数)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java的不同版本:J2SE、J2EE、
- 下一篇: linux cmake编译源码,linu