流程控制结构
/*
顺序、分支、循环
*/
一、分支结构
1.if函数
/*
语法:if(条件, 值1,值2)
功能:实现双分支
作为表达式:可以放在begin end中或外面
*/
2.case结构
/*
语法:
1:等值判断
case 变量或表达式
when 判断的值1 then 返回的值1 或 语句1;
when 判断的值2 then 返回的值2 或 语句2;
...
else 返回的值n 或 语句n;
end 或 end case;
2:区间判断
case
when 条件1 then 返回的值1 或 语句1;
when 条件2 then 返回的值2 或 语句2;
...
else 返回的值n 或 语句n;
end 或 end case;
后面+值(作为表达式):可以放在begin end中或外面
后面+语句(作为独立的语句):只能放在begin end中
*/
案例:创建存储过程,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
CREATE PROCEDURE test_case( IN score INT )
BEGIN
CASE
WHEN score>= 90 THEN SELECT 'A' ;
WHEN score>= 80 THEN SELECT 'B' ;
WHEN score>= 60 THEN SELECT 'C' ;
ELSE SELECT 'D' ;
END CASE ;
END $
CALL test_case( 99 ) $
3.if结构
/*
语法:
if 条件1 then 语句1;
elseif 条件2 then 语句2;
... .
else 语句n;
end if;
只能放在begin end中
*/
案例:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
CREATE FUNCTION test_if( score FLOAT ) RETURNS CHAR
BEGIN
IF score>= 90 THEN RETURN 'A' ;
ELSEIF score>= 80 THEN RETURN 'B' ;
ELSEIF score>= 60 THEN RETURN 'C' ;
ELSE RETURN 'D' ;
END IF ;
RETURN ch;
END $
SELECT test_if( 87 ) $
二、循环结构
/*
分类:
while、loop、repeat
循环控制:
iterate类似于 continue,继续,结束本次循环,继续下一次
leave 类似于 break, 跳出,结束当前所在的循环
如果循环中添加循环控制语句,必须添加名称(标签)
只能放在begin end中
*/
1.while
/*
语法:
【标签: 】while 循环条件 do
循环体;
end while 【标签】;
先判断后执行
只能放在begin end中
*/
2.repeat
/*
语法:
【标签:】repeat
循环体;
until 结束循环的条件
end repeat 【标签】;
先执行后判断
只能放在begin end中
*/
3.loop
/*
语法:
【标签: 】loop
循环体;
end loop 【标签】;
无条件的死循环
只能放在begin end中
*/
1.没有添加循环控制语句
案例:批量插入,根据次数插入到admin表中多条记录
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 ) $
SELECT * FROM admin $
2.添加leave语句
案例:批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止
TRUNCATE TABLE admin$
DROP PROCEDURE test_while1$
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 ) $
SELECT * FROM admin $
3.添加iterate语句
案例:批量插入,根据次数插入到admin表中多条记录,只插入偶数次
TRUNCATE TABLE admin$
DROP PROCEDURE test_while1$
CREATE PROCEDURE test_while1( 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_while1( 100 ) $
SELECT * FROM admin $
很棒的练习!
/*
已知表stringcontent
其中字段:
id 自增长
content varchar(20)
向该表插入指定个数的,随机的字符串
*/
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 ) ;
SET len= FLOOR( RAND( ) * ( 20 - startIndex+ 1 ) + 1 ) ;
INSERT INTO stringcontent( content) VALUES ( SUBSTR( str, startIndex, len) ) ;
SET i= i+ 1 ;
END WHILE ;
END $
CALL test_randstr_insert( 10 ) $
SELECT * FROM stringcontent $