新聞中心
復(fù)合語句
在MariaDB 10.1.1+版本中,我們可以在存儲過程以外來使用復(fù)合語句了,顧名思義,復(fù)合語句就是將多條語句作為一個整體來執(zhí)行,可以在其中使用一些邏輯判斷,循環(huán)等功能,大大提高了SQL語言的可編程性。

在存儲過程以外使用復(fù)合語句需要遵守以下約定:
-
僅可使用BEGIN, IF, CASE, LOOP, WHILE, REPEAT語句
-
BEGIN必須使用BEGIN NOT ATOMIC,這樣不會規(guī)避autocommit
-
不能以標(biāo)簽開頭
當(dāng)要使用復(fù)合語句時,可以使用如下的格式來使用:
BEGIN [NOT ATOMIC]
[statement_list]
END
因為SQL語句要使用;來作為結(jié)束的標(biāo)識符,但是,多條SQL語句,到底哪個才是結(jié)束符了?所以我們可以將復(fù)合語句的結(jié)束符修改為其他字符,使用如下命令即可:|可以替換為任意數(shù)量的任意字符。
delimiter |
//該命令在當(dāng)前會話有效,會影響后續(xù)所有SQL語句的結(jié)束符
復(fù)合語句例子
MariaDB [world]> DELIMITER ||
MariaDB [world]> BEGIN NOT ATOMIC
-> SELECT * FROM user;
-> SELECT * FROM department;
-> END
-> ||
會順序顯示兩張表的內(nèi)容,但是,有什么呢?
嘿,都說了,增加了可編程性,還沒判斷、循環(huán)呢。
定義本地變量
本地變量僅在當(dāng)前BEGIN..END內(nèi)生效**,定義一個本地變量的語法如下:
DECLARE var_name [, var_name] type [DEFAULT value]
type就是MariaDB中支持的那些數(shù)據(jù)類型。
比如如下例子:查詢test1用戶的組ID并放入到tmpdid變量中去
MariaDB [world]> BEGIN NOT ATOMIC
-> DECLARE tmpdid INT DEFAULT 0;
-> SELECT deptid INTO tmpdid FROM user WHERE name='test1';
-> SELECT tmpdid;
-> END|
+--------+
| tmpdid |
+--------+
| 1 |
+--------+
1 row in set (0.00 sec)
所以說,BEGIN…END是可以嵌套使用的,如在IF語句中使用BEGIN…END來創(chuàng)建一個新的定義域,當(dāng)然BEGIN…END也是開啟事務(wù)的標(biāo)志
IF語句
語法如下:
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF
這個就跟編程語言中的一樣了,不再絮叨,來試試吧。
BEGIN NOT ATOMIC
DECLARE tmpdid INT DEFAULT 0;
SELECT deptid INTO tmpdid FROM user WHERE name='test1';
IF (tmpdid = 1) THEN
SELECT 'The User test1 is the member of salse';
ELSE
SELECT * FROM department WHERE id = tmpdid;
END IF;
END|
所以search_condition只要是可以表達(dá)TRUE或FALSE的表達(dá)式都行,比如:
BEGIN NOT ATOMIC
IF EXISTS(SELECT * FROM user WHERE name = 'lucy') THEN
SELECT 'Find the user lucy';
ELSE
SELECT 'Not Find';
END IF;
END|
+--------------------+
| Find the user lucy |
+--------------------+
| Find the user lucy |
+--------------------+
1 row in set (0.00 sec)
CASE 語句
CASE有兩種用法,一種是像編程語言中的SWITCH一樣,進行數(shù)據(jù)的挑選,另一種則是實現(xiàn)了多分支的IF-ELSE語句,語法如下:
//對某一個值進行篩選
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE
//多分支的IF-ELSE
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
…想不出來例子,放棄,哪天想到了再來補吧。
附官方例子一枚:
DELIMITER |
CREATE PROCEDURE p()
BEGIN
DECLARE v INT DEFAULT 1;
CASE v
WHEN 2 THEN SELECT v;
WHEN 3 THEN SELECT 0;
ELSE BEGIN END;
END CASE;
END;
|
LOOP語句
LOOP之前沒有用過,好像很多編程語言里都沒有LOOP這個關(guān)鍵字了,用來實現(xiàn)簡單的循環(huán),需要配合LEAVE語句跳出循環(huán)。
設(shè)置一變量,將其加到100并退出:為啥要加到100?鬼知道,哈哈哈。
BEGIN NOT ATOMIC
DECLARE tempNum INT DEFAULT 0;
test:LOOP
SET tempNum=tempNum+1;
IF tempNum=100 THEN
LEAVE test;
END IF;
END LOOP test;
SELECT tempNum;
END;
|
所以LOOP的語法如下:
[begin_label:] LOOP
statement_list
END LOOP [end_label]
通常,需要設(shè)置一個begin_label,用于標(biāo)識該循環(huán),以方便使用LEAVE跳出該循環(huán),而end_label可以省略,但是如果想要給end_label的話,必須與begin_label的名稱相同,而LEAVE的語法就很簡單了:
LEAVE label
WHILE語句
WHILE就與編程語言中的一樣了,語法如下:
[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
當(dāng)search_condition表達(dá)式不為TRUE時則不再執(zhí)行循環(huán)。
查找某一用戶的ID值為多少,為什么要寫個循環(huán)呢?不知道呀,用WHERE不更好嗎?
REPEAT..LOOP循環(huán)
REPEAT循環(huán)看起來非常像do…while循環(huán),好吧,其實就是一回事。
第一次循環(huán)體不判斷任何條件執(zhí)行一次,然后再判斷條件,如果條件還滿足則繼續(xù)執(zhí)行,直到條件不滿足為之,語法如下:
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
拼接所有用戶名為一個字符串:
MariaDB [world]> BEGIN NOT ATOMIC
-> DECLARE i INT DEFAULT 1;
-> DECLARE userNames VARCHAR(200) DEFAULT '';
-> DECLARE tmpName VARCHAR(10) DEFAULT '';
-> DECLARE userNums INT DEFAULT 0;
-> SELECT COUNT(id) INTO userNums FROM user;
-> REPEAT
-> SELECT name INTO tmpName FROM user WHERE id = i;
-> SET userNames = CONCAT(userNames,',',tmpName);
-> SET i = i +1;
-> UNTIL NOT i END REPEAT;
-> SELECT userNames;
-> END|
+--------------------------------------------------------------------------------------------+
| userNames |
+--------------------------------------------------------------------------------------------+
| ,test,test1,lucy,mars,mark,test6,test7,test7,test8,test8,test9,test10,test11,test12,test13 |
+--------------------------------------------------------------------------------------------+
網(wǎng)站欄目:詳解Mariadb復(fù)合語句和流程控制
鏈接URL:http://m.fisionsoft.com.cn/article/dhhhdgg.html


咨詢
建站咨詢
