中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Mariadb復合語句和流程控制怎么實現

發布時間:2022-02-19 14:04:08 來源:億速云 閱讀:119 作者:iii 欄目:開發技術

本篇內容主要講解“Mariadb復合語句和流程控制怎么實現”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Mariadb復合語句和流程控制怎么實現”吧!

復合語句

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

Mariadb復合語句和流程控制怎么實現

在存儲過程以外使用復合語句需要遵守以下約定:

  • 僅可使用BEGIN, IF, CASE, LOOP, WHILE, REPEAT語句
  • BEGIN必須使用BEGIN NOT ATOMIC,這樣不會規避autocommit
  • 不能以標簽開頭

當要使用復合語句時,可以使用如下的格式來使用:

BEGIN [NOT ATOMIC]
   [statement_list]
END

因為SQL語句要使用;來作為結束的標識符,但是,多條SQL語句,到底哪個才是結束符了?所以我們可以將復合語句的結束符修改為其他字符,使用如下命令即可:|可以替換為任意數量的任意字符。

delimiter |
//該命令在當前會話有效,會影響后續所有SQL語句的結束符

復合語句例子

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

會順序顯示兩張表的內容,但是,有什么呢?

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

定義本地變量

本地變量僅在當前BEGIN..END內生效**,定義一個本地變量的語法如下:

DECLARE var_name [, var_name] type [DEFAULT value]type就是MariaDB中支持的那些數據類型。

比如如下例子:查詢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來創建一個新的定義域,當然BEGIN…END也是開啟事務的標志

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只要是可以表達TRUE或FALSE的表達式都行,比如:

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一樣,進行數據的挑選,另一種則是實現了多分支的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這個關鍵字了,用來實現簡單的循環,需要配合LEAVE語句跳出循環。

設置一變量,將其加到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]

通常,需要設置一個begin_label,用于標識該循環,以方便使用LEAVE跳出該循環,而end_label可以省略,但是如果想要給end_label的話,必須與begin_label的名稱相同,而LEAVE的語法就很簡單了:

LEAVE label
WHILE語句

WHILE就與編程語言中的一樣了,語法如下:

[begin_label:] WHILE search_condition DO
   statement_list
END WHILE [end_label]

當search_condition表達式不為TRUE時則不再執行循環。

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

REPEAT..LOOP循環

REPEAT循環看起來非常像do…while循環,好吧,其實就是一回事。

第一次循環體不判斷任何條件執行一次,然后再判斷條件,如果條件還滿足則繼續執行,直到條件不滿足為之,語法如下:

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

到此,相信大家對“Mariadb復合語句和流程控制怎么實現”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

芦溪县| 高尔夫| 吴江市| 剑阁县| 玛纳斯县| 清丰县| 阿城市| 临沂市| 棋牌| 确山县| 凤山市| 泰州市| 乌恰县| 龙海市| 曲水县| 孙吴县| 宁陵县| 高州市| 施甸县| 甘肃省| 宝应县| 辉南县| 义乌市| 鸡东县| 苏尼特左旗| 临沧市| 安阳县| 桐乡市| 昔阳县| 浑源县| 平乡县| 纳雍县| 武功县| 株洲市| 琼中| 文登市| 苏尼特右旗| 宣恩县| 桦川县| 德保县| 公主岭市|