mysql——流程控制结构

浪尽此生 提交于 2020-03-17 22:15:07

流程控制结构

顺序结构:程序从上外下执行
分支结构:程序可以从两条或者多条去执行
循环结构:程序在男足一定的条件基础上重复执行一段代码


一、分支结构

1、IF函数

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

2、CASE结构

(如果THEN后面加语句则需要用分号结尾)
①类似于java中的switch语句,一般用于实现等值判断
语法:
CASE 变量|表达式|字段
WHEN 判断值 THEN 返回值1或语句1
..........
ELSE 要返回的值n
END CASE;

②类似于java中的多重IF语句,一般用于实现区间判断
CASE
WHEN 判断条件1 THEN 返回值1或语句1
.........
ELSE 返回值n或语句n
END CASE;

特点:
①可以作为表达式,嵌套在其他语句中使用,可以放在任何地方
②可以作为独立的语句去使用,只能放在BEGIN  END中使用
③如果要WHEN中的值满足或条件成立则执行THEN后面的语句,并结束CASE,如果都不满足则执行ELSE中的语句或值
④如果ELSE省略且WHEN中的所有条件都不满,则返回NULL

案例:创建存储过程,根据传入的成绩,显示等级
比如传入的90-100显示A,80-90显示B,60-80显示C,否则显示D

DROP PROCEDURE testg1;
DELIMITER $
CREATE PROCEDURE testg1(IN grade INT)
BEGIN
    CASE
    WHEN grade BETWEEN 90 AND 100 THEN SELECT 'A';
    WHEN grade BETWEEN 80 AND 90 THEN SELECT 'B';
    WHEN grade BETWEEN 60 AND 80 THEN SELECT 'C';
    ELSE SELECT 'D';
    END CASE;
END $
CALL testg1(92);

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 testg2(grade INT) RETURNS CHAR
BEGIN 
    IF grade BETWEEN 90 AND 100 THEN RETURN 'A';
    ELSEIF grade BETWEEN 80 AND 90 THEN RETURN 'B';
    ELSEIF grade BETWEEN 60 AND 80 THEN RETURN 'C';
    ELSE RETURN 'D';
    END IF;
END $
SELECT testg2(100);

二、循环结构

分类: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表中多条记录

DROP PROCEDURE while1;
DELIMITER $
USE girls$
CREATE PROCEDURE while1(insertcount INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    a:WHILE i<insertcount DO
        INSERT INTO admin(username,`password`) VALUES(CONCAT('rose',i),'666');
        SET i=i+1;
    END WHILE a;
END $

CALL while1(10);

添加LEAVE语句

案例2:批量插入,根据设置的次数,插入到admin表中多条记录,如果次数>20则停止

TRUNCATE admin;
DROP PROCEDURE while2;
DELIMITER $
USE girls$
CREATE PROCEDURE while2(insertcount INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    a:WHILE i<insertcount DO
        INSERT INTO admin(username,`password`) VALUES(CONCAT('rose',i),'666');
        IF(i>=20) THEN LEAVE a;
        END IF;
        SET i=i+1;
    END WHILE a;
END $
CALL while2(100);

3、添加ITERATE语句

案例2:批量插入,根据设置的次数,插入到admin表中多条记录,只插入偶数次的语句

TRUNCATE admin;
DROP PROCEDURE test3;
DELIMITER $
USE girls$
CREATE PROCEDURE test3(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('xwg',i),i*3);
    END WHILE a;
END $

CALL test3(20);

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

USE test;
CREATE TABLE stringcontent(
    id INT PRIMARY KEY AUTO_INCREMENT,
    content VARCHAR(20)
);
TRUNCATE stringcontent;
DROP PROCEDURE insert_to_sc;
DELIMITER $
CREATE PROCEDURE insert_to_sc(IN num INT)
BEGIN
    DECLARE i INT DEFAULT 1;    #i表示插入的次数
    DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
    DECLARE setindex INT DEFAULT 1;    #代表起始索引
    DECLARE len INT DEFAULT 1;    #代表截取长度
    a:WHILE i<num DO
        SET setindex=FLOOR(RAND()*26+1);
        SET len=FLOOR(RAND()*(20-setindex+1)+1);
        INSERT INTO stringcontent(content) VALUES(SUBSTR(str,setindex,len));
        SET i=i+1;
    END WHILE a;
END $

CALL insert_to_sc(10);

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!