1. 程式人生 > >MySQL_高級部分

MySQL_高級部分

中一 裏的 永久 屬於 都是 wid limit itl lock

事務

事務就是把一批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_高級部分