語句塊模式
在mysql編程中,begin...end;基本代替了原來編程語句中的{...}語法。但又有所區別:一個begin...end;塊可以使用leave語句來“退出”該語句塊。
流程控制
- if語句
- case語句:類似于php中的swich case
- loop語句:循環語句
- while語句:循環語句
- repeat語句:循環語句
- leave語句:類似于break
MySQL中的變量
變量有使用場景限制:在執行create、insert、delete、update、select等語句的環境(命令環境)下,不能使用流程控制語句。只能在存儲函數、存儲過程、觸發器(變成環境)環境下使用。
//變量聲明語法
declare 變量名 變量類型 [default 初始值]
//變量賦值語法
set 變量名 = 變量值
注意:
MySQL有另外幾種種變量形式叫做“會話變量”,會話變量的形式為:@變量名;會話變量無需單獨聲明,而是直接賦值,除此之外,既它可以在編程環境下使用,也可在命令環境下使用
//會話變量的形式為:@變量名;
@變量名;
//會話變量賦值
set 變量名 = 值;
set 變量名 = 表達式;//使用語法1:必須先使用declare聲明,需要編程環境
set @變量名 = 表達式//使用語法2:無需使用declare,而是直接賦值,類似php定義變量并賦值,無需編程環境
select @變量名 := 表達式;//使用語法3:此語句會給變量賦值,同時還會作為一個select語句返回"結果集"
select 表達式 into @變量名;//不輸出"結果集",只給變量賦值
存儲函數
定義形式:
#參數類型和返回類型可以使mysql中的各種數據類型,例如:varchar
#必須有return語句,返回類型要跟設定類型一致
creat function 函數名(形參1 類型1,形參2 類型2,...)
returns 返回類型
begin
#這里寫完整的函數語句
return xx;
end
舉例:
Snip20170304_1.png
調用形式:
跟系統函數調用形式一樣,例如:
select 3,now(),f1();//f1為自定義的存儲函數
舉例:
Snip20170304_2.png
存儲過程
存儲過程是沒有返回值的“函數”,雖然如此,但可以“返回”結果集。
定義形式
create procedure 存儲過程名([in|out|inout]形參1 類型1,[in|out|inout]形參2 類型2,...)
begin
#這里寫完整的過程語句
#其中查詢語句(select)會作為存儲過程調用的結果,返回結果集
end
舉例:
Snip20170304_3.png
特別注意:
in,out,inout用于修飾一個形參的"數據流向"
- in:默認值,只作為外部輸入數據,調用環境傳入存儲過程內部
- out:只作為輸出數據,即存儲過程傳出到調用環境
-
inout:雙向傳輸
舉例:
Snip20170304_8.png
調用形式
call 存儲過程名(參數);
舉例:
Snip20170304_4.png
Snip20170304_6.png
觸發器
在對數據表操作之前或之后執行預先定義好的一段代碼。類似于iOS中頁面生命周期的那幾個方法。
定義形式
creat trigger 觸發器名 before(或after) insert(update 或 delete) on 表名 as begin
要執行的代碼
end;
舉例:
Snip20170304_10.png
注意:在觸發器內部,兩個關鍵字。new:代表新插入的一條數據,在insert時有效。old:代表舊的一條數據,在update或delete的時候有效。
對表操作時自動調用
Snip20170304_11.png
總結
- 存儲函數:需要返回數據,作為數據使用
- 存儲過程:不能有返回值,可設定數據的進出方向(in,out,inout),使用call語句調用
- 觸發器:不能返回數據,也不能有select語句,在特定情況下自動調用