MySQL_高級部分
事務
事務就是把一批SQL指令做為一個批次,要就一起執行所有SQL指令,只要有其中一個SQL指令出現問題,則所有的SQL指令都不執行。
在MySQL 中,每一個SQL語句都是一個獨立的事務,前一條指令與後一條指令沒有任何關系。
事務有四大特性
ACID,原子性、一致性、隔離性、持久性
原子性:表示事務是一個不可分隔的基本單元,裏面的SQL指認集是一個整體,要就一起執行,否則就都不執行。
一致性:事務執行前後,表中的數據要保持一致。
隔離性:事務相互獨立,互不幹涉,互不影響。
持久性:事務提交後,對表中的數據的影響是持久性的,永久性的,也叫永久性。
事務的類型
隱式事務,自動提交(默認),顯示事務(用戶自定義,需要顯示的開始及顯示的提交或回滾),
我們所做的事務屬於類型為:顯示事務。
操作步驟
1. 關閉事務的自動提交
2. 開始事務,設置事務的回滾點
3. 操作SQL指令
4. 提交或者回滾
5. 開啟事務的自動提交
轉賬的示例:
set autocommit =0; -- 表示把自動提交關閉
start TRANSACTION; -- 開始事務
update bank set money = money+10000 where cardid = 220022;
update bank set money = money-10000 where cardid = 220011
-- 提交 commit;
rollback; -- 回滾
set autocommit = 1; -- 開啟自動提交
索引
Index 索引就是在某一些列上加上一些有利於查詢的標記,能提高查詢的性能,但是有的索引反而會降低增刪改的性能。關鍵字:index;
索引在創建在列上。而且這一列通常用作於查詢的條件或排序字段。
創建索引需要註意
1. 數據量少的表不適合創建。
2.列中的值重復性比較大也不適合。
表中一旦加了索引,在查詢表時,系統有一個優化機制,會自動采用最佳的方式來查詢數據。
在MySQL中,索引分:主鍵索引、唯一索引、普通索引、全文索引
主鍵索引是唯一索引的一種特例,它能保證這一列中的值的唯一性。通常,我們創建主鍵,則系統會自動創建主鍵索引在這一列上。
部分索引的順序會影響到數據行在表中的順序。所心會導致增刪改操作時性能方面的下降。
視圖
View 視圖的作用是隱藏一些比較敏感的數據,不同角色所看到的數據是不一樣的,同時,視圖本身是沒有數據的,我們基於視圖查詢時,數據是來自於物理表。
視圖裏的代碼只能是select語句,也就是說,視圖只有查詢效果。
但是可以基於視圖對物理表進行增刪改的操作,前提條件是視圖的數據只能來自於一張表,而且會影響物理表中的數據。
存儲過程
procedure 是一組預編譯在數據庫服務器端的處理業務的SQL代碼。在應用程序中可以調用存儲過程,執行SQL指令,調用的方式與Java中的方法調用類似。
優勢
1. 安全性高 2.速度快 3.減少網絡流量 4. 代碼重用。
缺點:數據庫不同,過程的代碼也不同,所以,數據庫如果更換,就比較麻煩。
調用過程:call 過程名[參數]
創建過程的語法:
無參的存儲過程
DELIMITER $$ -- 標記過程創建的開始,作用避免系統對業務代碼中的;的誤解
create PROCEDURE sp_student()
begin
-- 業務代碼在這裏
select * from student;
end $$ -- 過程的結束
帶參的存儲過程
參數有三種:輸入參數(in 默認)、輸出參數(out)、輸入輸出參數(inout)
輸入參數:需要把值傳入到過程裏面
-- 查詢指定學期的課程信息(編號、課程名、課時、年級名稱),如果沒有輸入則查詢所有年級科目,否則只查詢當前年級的科目信息
DELIMITER $$ create PROCEDURE sp_subjectByGradeName(in gn varchar(10) ) begin if(gn is null or gn = ‘‘) then -- if開始 select subjectNo,subjectName,classHour,gradeName from grade g inner join subject j on g.gradeid = j.gradeid; else select subjectNo,subjectName,classHour,gradeName from grade g inner join subject j on g.gradeid = j.gradeid where g.gradeName=gn; end if; -- if結束 end $$
輸出參數:把過程裏面的值傳出,調用時就可以獲取。參數前加:out
當一個過程中的參數又有輸入參數,又有輸出參數,建議把輸出參數在前面,輸入參數放在後面,方便於以後的調用。
輸入輸出參數:把值傳入到過程中去,並在過程中又對參數進行賦值,此參數可以把過程中所賦的值傳出來,在調用的位置可以獲取到。參數前加: inout
stuId 參數傳入了學號3,在過程中取得此學員的年齡並賦值給stuId參數,
調用後,在外部輸入stuId參數的值,結果是 25.
MySQL_高級部分