日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
詳解Mariadb復(fù)合語句和流程控制

復(fù)合語句

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

在存儲(chǔ)過程以外使用復(fù)合語句需要遵守以下約定:

  • 僅可使用BEGIN, IF, CASE, LOOP, WHILE, REPEAT語句
  • BEGIN必須使用BEGIN NOT ATOMIC,這樣不會(huì)規(guī)避autocommit
  • 不能以標(biāo)簽開頭

當(dāng)要使用復(fù)合語句時(shí),可以使用如下的格式來使用:

BEGIN [NOT ATOMIC]
   [statement_list]
END

因?yàn)镾QL語句要使用;來作為結(jié)束的標(biāo)識(shí)符,但是,多條SQL語句,到底哪個(gè)才是結(jié)束符了?所以我們可以將復(fù)合語句的結(jié)束符修改為其他字符,使用如下命令即可:|可以替換為任意數(shù)量的任意字符。

delimiter |
//該命令在當(dāng)前會(huì)話有效,會(huì)影響后續(xù)所有SQL語句的結(jié)束符

復(fù)合語句例子

MariaDB [world]> DELIMITER ||
MariaDB [world]> BEGIN NOT ATOMIC
   -> SELECT * FROM user;
   -> SELECT * FROM department;
   -> END
   -> ||

會(huì)順序顯示兩張表的內(nèi)容,但是,有什么呢?

嘿,都說了,增加了可編程性,還沒判斷、循環(huán)呢。

定義本地變量

本地變量僅在當(dāng)前BEGIN..END內(nèi)生效**,定義一個(gè)本地變量的語法如下:

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)建一個(gè)新的定義域,當(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

這個(gè)就跟編程語言中的一樣了,不再絮叨,來試試吧。

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一樣,進(jìn)行數(shù)據(jù)的挑選,另一種則是實(shí)現(xiàn)了多分支的IF-ELSE語句,語法如下:

//對(duì)某一個(gè)值進(jìn)行篩選
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

…想不出來例子,放棄,哪天想到了再來補(bǔ)吧。

附官方例子一枚:

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這個(gè)關(guān)鍵字了,用來實(shí)現(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è)置一個(gè)begin_label,用于標(biāo)識(shí)該循環(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時(shí)則不再執(zhí)行循環(huán)。

查找某一用戶的ID值為多少,為什么要寫個(gè)循環(huán)呢?不知道呀,用WHERE不更好嗎?

REPEAT..LOOP循環(huán)

REPEAT循環(huán)看起來非常像do…while循環(huán),好吧,其實(shí)就是一回事。

第一次循環(huán)體不判斷任何條件執(zhí)行一次,然后再判斷條件,如果條件還滿足則繼續(xù)執(zhí)行,直到條件不滿足為之,語法如下:

[begin_label:] REPEAT
   statement_list
UNTIL search_condition
END REPEAT [end_label]

拼接所有用戶名為一個(gè)字符串:

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 |
+--------------------------------------------------------------------------------------------+

本文名稱:詳解Mariadb復(fù)合語句和流程控制
文章來源:http://www.5511xx.com/article/dhhhdgg.html