日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL高级篇(事务视图存储过程与函数)

發(fā)布時(shí)間:2025/3/15 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL高级篇(事务视图存储过程与函数) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

一.事務(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表中多條記錄

CREATE PROCEDURE pro_while1(IN insertCount INT) BEGINDECLARE i INT DEFAULT 1;WHILE i<=insertCount DOINSERT INTO admin(username,`password`) VALUES(CONCAT('Rose',i),'999');SET i=i+1;END WHILE; END$調(diào)用: CALL pro_while1(100)$

結(jié)果:

2.添加循環(huán)控制語句
案例:批量插入,根據(jù)次數(shù)插入到admin表中多條記錄leave

案例1:批量插入,根據(jù)次數(shù)插入到admin表中多條記錄(leave) CREATE PROCEDURE pro_while3(IN insertCount INT) BEGINDECLARE i INT DEFAULT 1;a:WHILE i<=insertCount DOINSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'999');IF i>=20 THEN LEAVE a;#插入20條END IF;SET i=i+1;END WHILE a; END$調(diào)用: CALL pro_while3(100)$=============================================案例2:批量插入,偶數(shù)次插入到admin表中多條記錄(iterate) TRUNCATE TABLE admin$ CREATE PROCEDURE pro_while4(IN insertCount INT) BEGINDECLARE i INT DEFAULT 0;a:WHILE i<=insertCount DOSET i=i+1;IF MOD(i,2)!=0 THEN ITERATE a;END IF;INSERT INTO admin(username,`password`) VALUES(CONCAT('xiao',i),'888');END WHILE a; END$調(diào)用: CALL pro_while4(100)$

結(jié)果:

MySQL在這里就告一段落了,接下來就進(jìn)入JDBC的學(xué)習(xí)了。

這些年,我一直提醒自己一件事,千萬不要感動(dòng)自己。大多數(shù)人看似的努力,不過是愚蠢導(dǎo)致的。什么熬夜看書到天亮,連續(xù)幾天只睡幾個(gè)小時(shí),多久沒放假了,如果這些東西也值得夸耀,那么富士康流水線上的任何一個(gè)人都比你努力多了。人難免天生有自憐的情緒,唯有時(shí)刻保持清醒,才能看清真正的價(jià)值在哪里。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???——于宙《我們這一代人的困惑》

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的MySQL高级篇(事务视图存储过程与函数)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。