SQL第9/9篇(基础部分完结撒花)流程控制结构

流程控制结构

1.顺序结构
2.分支结构
3.循环结构

一、分支结构

1.if 函数

功能:简单的双分支
语法:if(表达式1,表达式2,表达式3)
执行顺序:如果表达式1成立,返回表达式2,否则返回表达式3
应用:任何地方

2. case结构

情况1:实现等值判断,类似于switch语句

case 字段|变量|表达式
when 常量1 then 语句1;
when 常量2 then 语句2;

……

else 语句n;
end case;

情况2:实现区间判断,类似于多重if语句

case 
when 条件1 then 语句1;
when 条件2 then 语句2;

……

else 语句n;
end case;
case作为表达式.png

case独立语句.png

特点:
1.每条语句后面加分号,最后用end case结尾 ,而不用end
2.可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,放在begin end 中或者之外
3.可以独立使用,只能放在begin end中

执行顺序:
如果when中的条件之一满足,执行后直接跳出
如果都不瞒满足,则执行else中的语句,如果没有else则返回null

案例:创建存储过程,根据传入的成绩显示等级,

90-100:A,80-90:B,60-80:C,否则显示D
DROP PROCEDURE myp_grade$
CREATE PROCEDURE myp_grade(IN score INT )
BEGIN 

    CASE 
    WHEN score BETWEEN 90 AND 100 THEN SELECT 'A';
    WHEN score BETWEEN 80 AND 90 THEN SELECT 'B';
    WHEN score BETWEEN 60 AND 80 THEN SELECT 'C';
    ELSE SELECT 'D';
    END CASE;

END$

CALL myp_grade(97)$

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
CREATE FUNCTION myfun_grede(score INT) RETURNS CHAR
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 myfun_grede(86)$

二、循环结构

分类:
while ,loop ,repeat

循环控制:
iterate:continue 结束本次循环,进入下次循环
leave:break 跳出循环结构

1、while

【标签:】while 循环条件 do
              循环体;
    
         end while 【标签】;

2.loop

【标签:】loop
          循环体;
         end loop 【标签】;

可以用来模拟死循环,想要结束 + leave

3.repeat

【标签:】 repeat
            循环体;
             until 结束循环的条件
          end repeat【标签】;

类似于do while 先执行一次,

案例练习

1、没有循环控制结构

案例:批量插入,根据次数在admin中插入多条记录
因为没有返回值,所以创建存储过程

DROP  PROCEDURE pro_while$
CREATE PROCEDURE pro_while(IN insertCount INT )
BEGIN 
    DECLARE i INT DEFAULT 1;
    
    WHILE i<=insertCount DO
    
        INSERT INTO admin (username,`password`)
        VALUES(CONCAT('Rose',i) ,'777');
        
        SET i = i + 1;
    END WHILE;

END$

/*
int i = 1
while (i <=insertCount){

//insert
i++
}
其他语言中的一般写法

*/

CALL pro_while(10)$

SELECT * FROM admin$

2,添加循环控制

上一个案例,在插入次数大于5时停止

TRUNCATE TABLE admin$
SELECT * FROM admin$
DROP PROCEDURE leave_while$
CREATE PROCEDURE leave_while(IN insertCount INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    a:WHILE i <= insertCount DO
        INSERT INTO admin  (username,`password`) VALUES(CONCAT('Fox',i),'8888');
        
        IF i >=5 THEN LEAVE a;  
        END IF;
        
        SET i = i+1;
    END WHILE a;
END$

CALL leave_while(10)$

iterate

上面的案例只插入偶数次的索引

TRUNCATE TABLE admin$
SELECT * FROM admin$

CREATE PROCEDURE iterate_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('Fox',i),'8888');
        
        
    END WHILE a;
END$

CALL iterate_while(10)$
iterate.png

案例练习

1,已知表strcontent,字段:id 自增长,content varchar(20),向该表插入指定个数的随机字符串

DROP TABLE IF EXISTS strcontent;
CREATE TABLE strcontent(
    id INT PRIMARY KEY AUTO_INCREMENT,
    content VARCHAR(20)
);
DELIMITER $
DROP PROCEDURE test_randstr$
CREATE PROCEDURE test_randstr( IN insertCount INT)
BEGIN
    
        DECLARE i INT DEFAULT 1;
        DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
        DECLARE start_index INT DEFAULT 1;#代表起始索引
        DECLARE len INT DEFAULT 1;#代表截取的字符的长度
        
        WHILE i <= insertCount DO
            
            SET len  = FLOOR(RAND()*(20-start_index+1)+1);
            #产生随机数,代表可以截取的长度(20-start_index)+1
            #因为要求是varchar(20)
            
            SET start_index = FLOOR(RAND()*26+1);
            #rand()[0-1)之间的值,无限接近于1
            #floor()向下取整 [0-26]
            
            INSERT INTO strcontent (content) 
            VALUES (SUBSTR( str,start_index,len));
        
            SET i = i+1;
        END WHILE;
END$
CALL test_randstr(5)$
SELECT * FROM strcontent$

三种循环结构的对比

1.三种循环都可以省略名字,但当有循环控制结构时不可省略

  1. loop:简单的死循环
    while:先判断再执行
    repeat:先执行再判断,即至少无条件执行一次


    循环结构.png

到此为止,mysql的基础部分已经完结了,亲自动手还是有很大收获的,希望你也跟着这个系列走了下来!

你可能感兴趣的:(SQL第9/9篇(基础部分完结撒花)流程控制结构)