1. 程式人生 > 其它 >知識筆記--流程控制結構

知識筆記--流程控制結構

1. 流程控制結構

順序結構:程式從上往下依次執行
分支結構:程式從兩條或多條路徑中選擇一條去執行
迴圈結構:程式在滿足一定條件的基礎上,重複執行一段程式碼

2. 分支結構

1. if函式

功能:
  實現簡單的雙分支
語法:
  if(表示式1,表示式2,表示式3)
執行順序:
  如果表示式1成立,則if函式返回表示式2的值,否則返回表示式3的值
應用:
  任何地方

2.case結構

特點:
1. 可以作為表示式,巢狀在其他語句中使用,可以放在任何地方,BEGIN END中或BEGIN END的外面
可以作為獨立的語句去使用,只能放在BEGIN END中
2. 如果WHEN中的值滿足或條件成立,則執行對應的THEN後面的語句,並且結束CASE
如果都不滿足,則執行ELSE中的語句或值
3. ELSE可以省略,如果ELSE省略了,並且所有WHEN條件都不滿足,則返回NULL。
案例
題:根據傳入的成績,來顯示等級,來顯示等級,比如傳入的成績:90-100,顯示A;80-90,顯示B;60-80,顯示C;否則顯示D。
delimiter $
create procedure test_case(IN score int) 
BEGIN
	CASE
	WHEN score >= 90 AND score <= 100 THEN select 'A';
	WHEN score >= 80 THEN select 'B';
	WHEN score >= 60 THEN select 'C';
	ELSE select 'D';
	END case;
END $

delimiter $
CALL test_case(60) $

3. if結構

功能:實現多量分支

語法:
if 條件1 then 語句1;
elseif 條件2 then 語句2;
...
[else 語句n;]
end if;

應用場合:
應用在begin end中
案例
題:根據傳入的成績,來顯示等級,來顯示等級,比如傳入的成績:90-100,返回A;80-90,返回B;60-80,返回C;否則返回D。
delimiter $
create FUNCTION test_if(score int) returns char(1)
BEGIN
	if score >= 90 AND score <= 100 THEN return 'A';
	elseif score >= 80 THEN return 'B';
	elseif score >= 60 THEN return 'C';
	else RETURN 'D';
	end if;
END $

select test_if(80) $

3. 迴圈結構

分類:
while loop repeat

迴圈控制:
iterate 類似於continue,結束本次迴圈,進行下一次迴圈。
leave 類似於break,跳出,結束當前所在的迴圈

1. while

語法:
[標籤:]while 迴圈條件 do
       迴圈體;
      end while [標籤];

2. loop

語法:
[標籤:]loop  
       迴圈體;
      end loop [標籤];
可以用來簡單的模擬死迴圈

3. repeat

語法:
[標籤:]repeat  
       迴圈體;
until 結束迴圈的條件
end repeat [標籤];

案例

1.批量插入,根據次數插入到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 $

delimiter $
call pro_while1(100) $

2.批量插入,根據次數插入到admin表中多條記錄,如果次數>20則停止
delimiter $
create procedure pro_while2(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 $

delimiter $
call pro_while2(33) $

3.新增iterate語句
批量插入,根據次數插入到admin表中多條記錄,如果次數>20則停止
delimiter $
create procedure pro_while(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 $

delimiter $
call pro_while(20) $

案例

1. 已知表stringcontent
其中欄位:
id 自增長
content varchar(20)
向該表插入指定個數的,隨機的字串


create table stringcontent(
	id int primary key auto_increment,
	content varchar(20)
);

delimiter $
create procedure test_randstr_insert2(IN insertCount INT)
BEGIN
	declare i int default 1; # 定義迴圈變數,表示插入次數
	declare str varchar(26) default 'abcdefghijklmnopqrstuvwxyz';
	declare startIndex int default 1; # 起始索引
	declare len INT DEFAULT 1; # 代表擷取的字元的長度
	while i <= insertCount DO
		set len = FLOOR(RAND()*(20-startIndex+1)+1);
		set startIndex = FLOOR(RAND()*20+1);
		insert into stringcontent(content)
		values(SUBSTR(str,startIndex,len));
		set i = i + 1;
	END WHILE;
END $

delimiter $
call test_randstr_insert2(20) $