SQL学习笔记整理16(流程控制结构)

`account``customers`#流程控制结构
/*
顺序结构
分支结构
循环结构
*/

#一、分支结构
#1.if函数
/*
if(表达式1,表达式2,表达式3):
    如果表达式1成立,返回表达式2,;不成立,返回表达式3

*/

#2.case函数
/*
情况1:一般用于等值判断
语法:    case 变量|表达式|字段
          when 要判断的值1 then 返回的值1或 语句1;
          when 要判断的值2 then 返回的值2或 语句2;
          ...
          else 返回的值n
          end case(返回语句时加case)
          
情况2:一般用于区间判断
语法:    case 
          when 要判断的条件1 then 返回的值1或 语句1;
          when 要判断的条件2 then 返回的值2或 语句2;
          ...
          else 返回的值n
          end case(返回语句时加case)
          
特点:
可以作为表达式,放在任何地方;
也可以作为独立的语句,只能放在begin end中
*/

#案例1:创建一个存储过程,输入一个成绩,返回等级。如果成绩在90-100,返回A;如果成绩在80-90,返回B;如果成绩在70-80,返回C;否则返回D
DELIMITER $
CREATE PROCEDURE test_pro1(IN score DOUBLE)
BEGIN
    CASE 
    WHEN score BETWEEN 90 AND 100 THEN SELECT 'A'; 
    WHEN score BETWEEN 80 AND 90 THEN SELECT 'B'; 
    WHEN score BETWEEN 70 AND 80 THEN SELECT 'C';
    ELSE SELECT 'D';
    END CASE;
END$

CALL test_pro1(69)$

DELIMITER $
CREATE PROCEDURE test_pro2(IN score DOUBLE)
BEGIN
    SELECT
    CASE 
    WHEN score BETWEEN 90 AND 100 THEN 'A'
    WHEN score BETWEEN 80 AND 90 THEN 'B' 
    WHEN score BETWEEN 70 AND 80 THEN 'C'
    ELSE 'D'
    END;
END$

CALL test_pro2(89)$

#3.if结构
/*
功能:实现多重分支
语法:
if 条件1 then 语句1;
elseif 条件2 then 语句2;
...
【else 语句n;】
end if;

只能应用在begin end中
*/
#案例:输入一个成绩,返回等级。如果成绩在90-100,返回A;如果成绩在80-90,返回B;如果成绩在70-80,返回C;否则返回D
DELIMITER $ 
CREATE FUNCTION testIf(score INT) RETURNS CHAR(1)
BEGIN
    DECLARE grade CHAR(1);
    IF score BETWEEN 90 AND 100 THEN SELECT 'A' INTO grade; 
    ELSEIF score BETWEEN 80 AND 90 THEN SELECT 'B' INTO grade;
    ELSEIF score BETWEEN 70 AND 80 THEN SELECT 'C' INTO grade;
    ELSE SELECT 'D' INTO grade;
    END IF;
    RETURN grade;
    
END$

SELECT testIf(96)$

#二、循环结构
/*
1.while
2.loop
3.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 test_while(IN insertCount INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE i<=insertCount DO
    INSERT INTO admin(username,PASSWORD) VALUES (CONCAT('john',i),'6666');
    SET i=i+1;
    END WHILE;
END $

#调用
CALL test_while(100)$

#添加leave语句
#案例1:批量插入,根据次数插入到admin表中多条记录,如果次数>20,则停止
DELIMITER $
CREATE PROCEDURE test_leave(IN insertCount INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    a:WHILE i<= insertCount DO
    INSERT INTO admin(username,PASSWORD) VALUES (CONCAT('sunny',i),'2333');
    IF i>=20 THEN LEAVE a;
    END IF;
    SET i=i+1;
    END WHILE a;
END$

CALL test_leave(25)$

#添加iterate语句
#案例:批量插入,根据次数插入到admin表中多条记录,只插入偶数
DELIMITER $
CREATE PROCEDURE test_iterate(IN insertCount INT)
BEGIN
    DECLARE i INT DEFAULT 0;
    a:WHILE i<insertCount DO
    SET i=i+1;
    IF i%2 THEN ITERATE a;
    END IF;
    INSERT INTO admin(username,PASSWORD) VALUES (CONCAT('david',i),'2150');
    END WHILE a;
END$


#流程控制经典案例
#案例1:
/*
已知表stringcontent
其中字段:
id 自增长
content varchar(20)
向该表插入指定个数的,随机的字符串
*/
CREATE TABLE stringcontent(
    id INT PRIMARY KEY AUTO_INCREMENT,
    content VARCHAR(20)
);

DELIMITER $
CREATE PROCEDURE test1(IN strcount INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
    DECLARE startindex INT DEFAULT 1;#起始索引
    DECLARE len INT DEFAULT 1;
    DECLARE slength INT DEFAULT 1;#最终截取字符串长度长度
    DECLARE sustr VARCHAR(20);
    
    WHILE i<=strcount DO
        SET startindex = FLOOR(RAND()*26+1);#rand():0-1的随机数
        SET len = FLOOR(RAND()*(26-startindex +1)+1);#最多能截取26-startindex+1个字符串
        SET slength = IF(len>20,20,len);#content的长度最大为20
        SET sustr = SUBSTR(str,startindex,slength);
        INSERT INTO stringcontent(content) VALUES(sustr );
        SET i=i+1;
    END WHILE;
END $
 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值