本篇文章給大家?guī)?lái)了mysql中自定義變量和語(yǔ)句結(jié)束分隔符的相關(guān)知識(shí),希望對(duì)大家有幫助。
存儲(chǔ)程序
有時(shí)候?yàn)榱送瓿梢粋€(gè)常用的功能需要執(zhí)行許多條語(yǔ)句,每次都在客戶端里一條一條的去輸入這么多語(yǔ)句是很煩的。設(shè)計(jì)MySQL
的大叔非常貼心的給我們提供了一種稱(chēng)之為存儲(chǔ)程序
的東東,這個(gè)所謂的存儲(chǔ)程序
可以封裝一些語(yǔ)句,然后給用戶提供一種簡(jiǎn)單的方式來(lái)調(diào)用這個(gè)存儲(chǔ)程序,從而間接地執(zhí)行這些語(yǔ)句。根據(jù)調(diào)用方式的不同,我們可以把存儲(chǔ)程序
分為存儲(chǔ)例程
、觸發(fā)器
和事件
這幾種類(lèi)型。其中,存儲(chǔ)例程
又可以被細(xì)分為存儲(chǔ)函數(shù)
和存儲(chǔ)過(guò)程
。我們畫(huà)個(gè)圖表示一下:
別看出現(xiàn)了很多陌生的概念,別怕,我們后邊會(huì)各個(gè)擊破的。不過(guò)在正式介紹存儲(chǔ)程序
之前,我們需要先了解一下MySQL
中的自定義變量和語(yǔ)句結(jié)束分隔符的概念。
自定義變量簡(jiǎn)介
生活中我們經(jīng)常會(huì)遇到一些固定不變的值,比如數(shù)字100
、字符串'你好呀'
,我們把這些值固定不變的東東稱(chēng)之為常量
??墒怯袝r(shí)候?yàn)榱朔奖?,我們?huì)使用某一個(gè)符號(hào)來(lái)代表一個(gè)值,它代表的值是可以變化的。比方說(shuō)我們規(guī)定符號(hào)a
代表數(shù)字1
,之后我們又可以讓符號(hào)a
代表數(shù)字2
,我們把這種值可以發(fā)生變化的東東稱(chēng)之為變量
,其中符號(hào)a
就稱(chēng)為這個(gè)變量的變量名
。在MySQL
中,我們可以通過(guò)SET
語(yǔ)句來(lái)自定義一些我們自己的變量,比方說(shuō)這樣:
mysql> SET @a = 1; Query OK, 0 rows affected (0.00 sec) mysql>
上邊的語(yǔ)句就表明我們定義了一個(gè)稱(chēng)之為a
的變量,并且把整數(shù)1
賦值給了這個(gè)變量。不過(guò)大家需要注意一下,設(shè)計(jì)MySQL的大叔規(guī)定,在我們的自定義變量前邊必須加一個(gè)@
符號(hào)(雖然有點(diǎn)兒怪,但這就是人家規(guī)定的,大家遵守就好了)。
如果我們之后想查看這個(gè)變量的值的話,使用SELECT
語(yǔ)句就好了,不過(guò)仍然需要在變量名稱(chēng)前加一個(gè)@
符號(hào):
mysql> SELECT @a; +------+ | @a | +------+ | 1 | +------+ 1 row in set (0.00 sec) mysql>
同一個(gè)變量也可以存儲(chǔ)存儲(chǔ)不同類(lèi)型的值,比方說(shuō)我們?cè)侔岩粋€(gè)字符串值賦值給變量a
:
mysql> SET @a = '哈哈哈'; Query OK, 0 rows affected (0.01 sec) mysql> SELECT @a; +-----------+ | @a | +-----------+ | 哈哈哈 | +-----------+ 1 row in set (0.00 sec) mysql>
除了把一個(gè)常量賦值給一個(gè)變量以外,我們還可以把一個(gè)變量賦值給另一個(gè)變量:
mysql> SET @b = @a; Query OK, 0 rows affected (0.00 sec) mysql> select @b; +-----------+ | @b | +-----------+ | 哈哈哈 | +-----------+ 1 row in set (0.00 sec) mysql>
這樣變量a
和b
就有了相同的值'哇哈哈'
!
我們還可以將某個(gè)查詢的結(jié)果賦值給一個(gè)變量,前提是這個(gè)查詢的結(jié)果只有一個(gè)值:
mysql> SET @a = (SELECT m1 FROM t1 LIMIT 1); Query OK, 0 rows affected (0.00 sec) mysql>
還可以用另一種形式的語(yǔ)句來(lái)將查詢的結(jié)果賦值給一個(gè)變量:
mysql> SELECT n1 FROM t1 LIMIT 1 INTO @b; Query OK, 1 row affected (0.00 sec) mysql>
因?yàn)檎Z(yǔ)句SELECT m1 FROM t1 LIMIT 1
和SELECT n1 FROM t1 LIMIT 1
的查詢結(jié)果都只有一個(gè)值,所以它們可以直接賦值給變量a
或者b
。我們查看一下這兩個(gè)變量的值:
mysql> SELECT @a, @b; +------+------+ | @a | @b | +------+------+ | 1 | a | +------+------+ 1 row in set (0.00 sec) mysql>
如果我們的查詢結(jié)果是一條記錄,該記錄中有多個(gè)列的值的話,我們想把這幾個(gè)值分別賦值到不同的變量中,只能使用INTO
語(yǔ)句了:
mysql> SELECT m1, n1 FROM t1 LIMIT 1 INTO @a, @b; Query OK, 1 row affected (0.00 sec) mysql>
這條查詢語(yǔ)句的結(jié)果集中只包含一條記錄,我們把這條記錄的m1
列的值賦值到了變量a
中,n1
列的值賦值到了變量b
中。
語(yǔ)句結(jié)束分隔符
在MySQL
客戶端的交互界面處,當(dāng)我們完成鍵盤(pán)輸入并按下回車(chē)鍵時(shí),MySQL
客戶端會(huì)檢測(cè)我們輸入的內(nèi)容中是否包含;
、g
或者G
這三個(gè)符號(hào)之一,如果有的話,會(huì)把我們輸入的內(nèi)容發(fā)送到服務(wù)器。這樣一來(lái),如果我們想一次性給服務(wù)器發(fā)送多條的話,就需要把這些語(yǔ)句寫(xiě)到一行中,比如這樣:
mysql> SELECT * FROM t1 LIMIT 1;SELECT * FROM t2 LIMIT 1;SELECT * FROM t3 LIMIT 1; +------+------+ | m1 | n1 | +------+------+ | 1 | a | +------+------+ 1 row in set (0.00 sec) +------+------+ | m2 | n2 | +------+------+ | 2 | b | +------+------+ 1 row in set (0.00 sec) +------+------+ | m3 | n3 | +------+------+ | 3 | c | +------+------+ 1 row in set (0.00 sec) mysql>
造成這一不便的原因在于,MySQL
客戶端檢測(cè)輸入結(jié)束用的符號(hào)和分隔各個(gè)語(yǔ)句的符號(hào)是一樣的!其實(shí)我們也可以用delimiter
命令來(lái)自定義MySQL
的檢測(cè)語(yǔ)句輸入結(jié)束的符號(hào),也就是所謂的語(yǔ)句結(jié)束分隔符
,比如這樣:
mysql> delimiter $ mysql> SELECT * FROM t1 LIMIT 1; -> SELECT * FROM t2 LIMIT 1; -> SELECT * FROM t3 LIMIT 1; -> $ +------+------+ | m1 | n1 | +------+------+ | 1 | a | +------+------+ 1 row in set (0.00 sec) +------+------+ | m2 | n2 | +------+------+ | 2 | b | +------+------+ 1 row in set (0.00 sec) +------+------+ | m3 | n3 | +------+------+ | 3 | c | +------+------+ 1 row in set (0.00 sec) mysql>
delimiter $
命令意味著修改語(yǔ)句結(jié)束分隔符為$
,也就是說(shuō)之后MySQL
客戶端檢測(cè)用戶語(yǔ)句輸入結(jié)束的符號(hào)為$
。上邊例子中我們雖然連續(xù)輸入了3個(gè)以分號(hào);
結(jié)尾的查詢語(yǔ)句并且按了回車(chē)鍵,但是輸入的內(nèi)容并沒(méi)有被提交,直到敲下$
符號(hào)并回車(chē),MySQL
客戶端才會(huì)將我們輸入的內(nèi)容提交到服務(wù)器,此時(shí)我們輸入的內(nèi)容里已經(jīng)包含了3個(gè)獨(dú)立的查詢語(yǔ)句了,所以返回了3個(gè)結(jié)果集。
我們也可以將語(yǔ)句結(jié)束分隔符
重新定義為$
以外的其他包含單個(gè)或多個(gè)字符的字符串,比方說(shuō)這樣:
mysql> delimiter EOF mysql> SELECT * FROM t1 LIMIT 1; -> SELECT * FROM t2 LIMIT 1; -> SELECT * FROM t3 LIMIT 1; -> EOF +------+------+ | m1 | n1 | +------+------+ | 1 | a | +------+------+ 1 row in set (0.00 sec) +------+------+ | m2 | n2 | +------+------+ | 2 | b | +------+------+ 1 row in set (0.00 sec) +------+------+ | m3 | n3 | +------+------+ | 3 | c | +------+------+ 1 row in set (0.00 sec) mysql>
我們這里采用了EOF
作為MySQL
客戶端檢測(cè)輸入結(jié)束的符號(hào),是不是很easy?。‘?dāng)然,這個(gè)只是為了方便我們一次性輸入多個(gè)語(yǔ)句,在輸入完成之后最好還是改回我們常用的分號(hào);
吧:
mysql> delimiter ;
小貼士: 我們應(yīng)該避免使用反斜杠()字符作為語(yǔ)句結(jié)束分隔符,因?yàn)檫@是MySQL的轉(zhuǎn)義字符。
推薦學(xué)習(xí):mysql視頻教程