順序結構java
分支結構sql
循環結構oop
分支結構:ui
1. if spa
if(表達式1,表達式2,表達式3)指針
若是:表達式1 = true,則執行表達式2;調試
若是:表達式1 = false,則執行表達式3;code
SET @a = 2; SELECT IF(@a = 3,NAME,money) FROM account WHERE userid = 1;
if 條件blog
then 語句it
else
語句
end if;
2.case
1.相似於switch case結構
case 變量(或表達式)
when 值1 then 語句;
when 值2 then 語句;
。。。
else 語句;
end case;
DELIMITER $$ CREATE PROCEDURE pro_test1(IN a INT) BEGIN SET @a = a; CASE @a WHEN 1 THEN SELECT 'A'; WHEN 2 THEN SELECT 'B'; WHEN 3 THEN SELECT 'C'; ELSE SELECT 'D'; END CASE; END $$ DELIMITER ; CALL pro_test1(2);
2.相似於if else結構
case
when 條件1 then 語句;
when 條件2 then 語句;
。。。
else 語句;
end case;
DELIMITER $$ CREATE PROCEDURE pro_test2(IN a INT) BEGIN SET @a = a; CASE WHEN @a = 1 THEN SELECT 'A'; WHEN @a = 2 THEN SELECT 'B'; WHEN @a = 3 THEN SELECT 'C'; ELSE SELECT 'D'; END CASE; END $$ DELIMITER ; CALL pro_test1(2);
else至關於java中的default,能夠省略,若是都不符合返回null。
循環結構
while java中的while while 循環條件 do 語句; end while;
loop java中的while(true) 須要利用leave來中止
repeat java中的do while repeat 語句 until 中止條件 end repeat
interate java中的continue 跳過此次循環,進入下一次循環
leave java中的break 結束當前循環 最好後面加上循環的標識名字= =個人 sqlyog 不加循環名字會報錯。。。
用循環作乘積
num1 個 num2 相加返回 result
1.while
DELIMITER $$ CREATE PROCEDURE pro_test_while(IN num1 INT, IN num2 INT, OUT result INT) BEGIN DECLARE i INT; SET i = 0; SET result = 0; WHILE i < num1 DO SET i = i + 1; SET result = result + num2; END WHILE; END $$ DELIMITER ; CALL pro_test_while(12,13,@re); SELECT @re;
2. loop
DELIMITER $$ CREATE PROCEDURE pro_test_loop(IN num1 INT, IN num2 INT, OUT result INT) BEGIN DECLARE i INT; SET i = 0; SET result = 0; l1: LOOP IF i = num1 THEN LEAVE l1; ELSE SET i = i + 1; SET result = result + num2; END IF; END LOOP l1; END $$ DELIMITER ; CALL pro_test_loop(12,13,@re); SELECT @re;
3.repeat
DELIMITER $$ CREATE PROCEDURE pro_test_repeat(IN num1 INT, IN num2 INT, OUT result INT) BEGIN DECLARE i INT; SET i = 0; SET result = 0; REPEAT SET i = i + 1; SET result = result + num2; UNTIL i = num1 END REPEAT; END $$ DELIMITER ; CALL pro_test_repeat(12,13,@re); SELECT @re;
遊標:
相似於java中的指針 和 foreach(Object o: ArrayList<Object> arr) 中的o
DELIMITER $$ CREATE PROCEDURE pro_test_cursor(IN p_uid1 INT, IN p_uid2 INT, OUT p_result VARCHAR(400)) BEGIN DECLARE p_uid INT; DECLARE p_uname VARCHAR(20); DECLARE p_done INT DEFAULT 0; DECLARE p_c CURSOR FOR SELECT uid, username FROM userinfo; #定義遊標c,c每次表示了查詢結果中的一行結果。 DECLARE CONTINUE HANDLER FOR NOT FOUND SET p_done=1; SET p_result = 'aaa'; OPEN p_c; #打開遊標 SELECT p_done, p_uid, p_uid1, p_uid2; #執行到這裏時輸出查詢結果,能夠用來調試bug l1: LOOP FETCH p_c INTO p_uid, p_uname; #把當前遊標指向的這一條結果賦給變量進行處理,同時遊標會挪到下一行。所以須要在這句執行完後判斷done = 1,不然最後一條會多處理一遍。 #以前用uid做爲變量名,發現會致使uid = null。可能不能和屬性名同樣。 IF p_done = 1 THEN LEAVE l1; END IF; #當done = 1時,說明已經找到了最後,直接leave #沒有leave時,進行判斷和處理 IF p_uid = p_uid1 OR p_uid = p_uid2 THEN SET p_result = CONCAT(p_result, '|', p_uname); END IF; END LOOP l1; CLOSE p_c; #關閉遊標 END $$ DELIMITER ; CALL pro_test_cursor(2,8,@re); SELECT @re;