您好,登錄后才能下訂單哦!
本篇內容主要講解“Mariadb復合語句和流程控制怎么實現”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Mariadb復合語句和流程控制怎么實現”吧!
在MariaDB 10.1.1+版本中,我們可以在存儲過程以外來使用復合語句了,顧名思義,復合語句就是將多條語句作為一個整體來執行,可以在其中使用一些邏輯判斷,循環等功能,大大提高了SQL語言的可編程性。
在存儲過程以外使用復合語句需要遵守以下約定:
當要使用復合語句時,可以使用如下的格式來使用:
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 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有兩種用法,一種是像編程語言中的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這個關鍵字了,用來實現簡單的循環,需要配合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就與編程語言中的一樣了,語法如下:
[begin_label:] WHILE search_condition DO statement_list END WHILE [end_label]
當search_condition表達式不為TRUE時則不再執行循環。
查找某一用戶的ID值為多少,為什么要寫個循環呢?不知道呀,用WHERE不更好嗎?
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復合語句和流程控制怎么實現”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。