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