前言、流程控制結(jié)構(gòu)
順序結(jié)構(gòu):程序從上往下順序執(zhí)行
分支結(jié)構(gòu):程序從兩條或者多條路徑中選擇一條執(zhí)行
循環(huán)結(jié)構(gòu):程序在滿足一定條件的基礎(chǔ)上蕾哟,重復(fù)執(zhí)行一段代碼
一一忱、分支結(jié)構(gòu)
1-1、if函數(shù)
語法:
if(條件谭确,值1帘营,值2)
特點:
可以用在任何位置
1-2、case結(jié)構(gòu)
語法:
情況一:類似于switch
case 表達式
when 值1 then 結(jié)果1或語句1(如果是語句逐哈,需要加分號)
when 值2 then 結(jié)果2或語句2(如果是語句芬迄,需要加分號)
...
else 結(jié)果n或語句n(如果是語句,需要加分號)
end 【case】(如果是放在begin end中需要加上case昂秃,如果放在select后面不需要)
情況二:類似于多重if
case
when 條件1 then 結(jié)果1或語句1(如果是語句禀梳,需要加分號)
when 條件2 then 結(jié)果2或語句2(如果是語句择诈,需要加分號)
...
else 結(jié)果n或語句n(如果是語句,需要加分號)
end 【case】(如果是放在begin end中需要加上case出皇,如果放在select后面不需要)
特點:
可以用在任何位置
1-3、if elseif結(jié)構(gòu)
語法:
if 情況1 then 語句1;
elseif 情況2 then 語句2;
...
else 語句n;
end if;
特點:
只能用在begin end中;└辍=妓摇!NㄒАI醋ⅰ!5ㄒ取D!J裾恰O规摇!:窳Q踉妗!
1-4别垮、三者的比較
三者比較:
應(yīng)用場合
if函數(shù) 簡單雙分支
case結(jié)構(gòu) 等值判斷 的多分支
if結(jié)構(gòu) 區(qū)間判斷 的多分支
二便监、分支結(jié)構(gòu)案例
#案例1:創(chuàng)建函數(shù),實現(xiàn)傳入成績碳想,如果成績>90,返回A烧董,如果成績>80,返回B,如果成績>60,返回C胧奔,否則返回D
DELIMITER $
CREATE FUNCTION test_if(score FLOAT) RETURNS CHAR
BEGIN
DECLARE ch CHAR DEFAULT 'A';
IF score>90 THEN SET ch='A';
ELSEIF score>80 THEN SET ch='B';
ELSEIF score>60 THEN SET ch='C';
ELSE SET ch='D';
END IF;
RETURN ch;
END $
SELECT test_if(87)
#案例2:創(chuàng)建存儲過程逊移,如果工資<2000,則刪除,如果5000>工資>2000,則漲工資1000葡盗,否則漲工資500
DELIMITER $
CREATE PROCEDURE test_if_pro(IN sal DOUBLE)
BEGIN
IF sal<2000 THEN DELETE FROM employees WHERE employees.salary=sal;
ELSEIF sal>=2000 AND sal<5000 THEN UPDATE employees SET salary=salary+1000 WHERE employees.`salary`=sal;
ELSE UPDATE employees SET salary=salary+500 WHERE employees.`salary`=sal;
END IF;
END $
CALL test_if_pro(2100)
#案例3:創(chuàng)建函數(shù)螟左,實現(xiàn)傳入成績,如果成績>90,返回A觅够,如果成績>80,返回B胶背,如果成績>60,返回C,否則返回D
CREATE FUNCTION test_case(score FLOAT) RETURNS CHAR
BEGIN
DECLARE ch CHAR DEFAULT 'A';
CASE
WHEN score>90 THEN SET ch='A';
WHEN score>80 THEN SET ch='B';
WHEN score>60 THEN SET ch='C';
ELSE SET ch='D';
END CASE;
RETURN ch;
END $
SELECT test_case(56)
三喘先、循環(huán)結(jié)構(gòu)
分類:
while钳吟、loop、repeat
循環(huán)控制:
iterate 類似于 continue窘拯,繼續(xù)红且,結(jié)束本次循環(huán)坝茎,繼續(xù)下一次
leave 類似于 break,跳出暇番,結(jié)束當前所在的循環(huán)
3-1嗤放、while循環(huán)
語法:
【標簽:】while 循環(huán)條件 do
循環(huán)體;
end while【 標簽】;
聯(lián)想:
while(循環(huán)條件){
循環(huán)體;
}
3-2、loop循環(huán)
語法:
【標簽:】loop
循環(huán)體;
end loop 【標簽】;
可以用來模擬簡單的死循環(huán)
3-3壁酬、repeat循環(huán)
語法:
【標簽:】repeat
循環(huán)體;
until 結(jié)束循環(huán)的條件
end repeat 【標簽】;
四次酌、循環(huán)結(jié)構(gòu)案例
#1.沒有添加循環(huán)控制語句
#案例:批量插入,根據(jù)次數(shù)插入到admin表中多條記錄
DELIMITER $
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i<=insertCount DO
INSERT INTO admin(username,`password`) VALUES(CONCAT('Rose',i),'666');
SET i=i+1;
END WHILE;
END $
CALL pro_while1(100)
#2.添加leave語句
#案例:批量插入舆乔,根據(jù)次數(shù)插入到admin表中多條記錄岳服,如果次數(shù)>20則停止
DELIMITER $
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i<=insertCount DO
INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
IF i>=20 THEN LEAVE a;
END IF;
SET i=i+1;
END WHILE a;
END $
CALL test_while1(100)
#3.添加iterate語句
#案例:批量插入,根據(jù)次數(shù)插入到admin表中多條記錄希俩,只插入偶數(shù)次
DELIMITER $
CREATE PROCEDURE test_while2(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 0;
a:WHILE i<=insertCount DO
SET i=i+1;
IF MOD(i,2)!=0 THEN ITERATE a;
END IF;
INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
END WHILE a;
END $
CALL test_while2(100)
經(jīng)典練習題
/*一吊宋、已知表stringcontent
其中字段:
id 自增長
content varchar(20)
向該表插入指定個數(shù)的,隨機的字符串
*/
DROP TABLE IF EXISTS stringcontent;
CREATE TABLE stringcontent(
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(20)
);
DELIMITER $
CREATE PROCEDURE test_randstr_insert(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
DECLARE startIndex INT;#代表初始索引
DECLARE len INT;#代表截取的字符長度
WHILE i<=insertcount DO
SET startIndex=FLOOR(RAND()*26+1);#代表初始索引颜武,隨機范圍1-26
SET len=FLOOR(RAND()*(20-startIndex+1)+1);#代表截取長度璃搜,隨機范圍1-(20-startIndex+1)
INSERT INTO stringcontent(content) VALUES(SUBSTR(str,startIndex,len));
SET i=i+1;
END WHILE;
END $
CALL test_randstr_insert(10)