mysql: 分支 & 循环

2019-08-28  本文已影响0人  哈斯勒
#流程控制语句
/*
 顺序结构:
 分支结构:
 循环结构:
*/

#一、分支结构
# if函数
/*
 功能:实现简单的双分支
 语法:
    if(表达式一,表达式2,表达式3) 类似条件语句
 应用:
    任何位置
    
*/

#二、case结构
#特点
/*①
  可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,begin end中或begin end的外面
  可以作为独立的语句去使用,只能放在begin end 中
  ②
  如果when中的值满足或条件成立,则执行对应的then后面的语句,并且结束case
  如果都不满足,执行else
  ③
  else可以省略,如果else省略,且所有的when条件都不满足,则返回null
*/

/*
 情况1:类似于java中switch语句,一般用于实现等值判断
    case 要判断的字段或表达式:
    when 常量1 then 要显示的值1或语句1;
    when 常量2 then 要显示的值2或语句2;
    else 要显示的值n或语句n
    end   
#查询员工的工资
部门号=30,显示工资*1.1
      =40       1.2
      =50       1.3
      其他        1

SELECT last_name, department_id, salary 原始工资,
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工资
FROM employees;

    
 情况2:类似于if,一般用于实现区间判断
    case
    when 条件1 then 要显示值1或语句1
    when 条件2 then 要显示值2或语句2
    else 要显示值n或语句n
    end
    
    #案例 查询员工的工资情况
    #如果工资>20000, 显示A级别
         >15000      B
             >10000      C
               否则,显示D级别
    SELECT last_name, department_id,salary,
    CASE
    WHEN salary>20000 THEN 'A'
    WHEN salary>15000 THEN 'B'
    WHEN salary>10000 THEN 'C'
    ELSE 'D'
    END AS 工资级别
    FROM employees;

*/
# 案例:创建存储过程,根据传入的成绩,来显示等级,90-100 A 80-90B 60-90 C 否则D
CREATE PROCEDURE test_case(IN score INT)
BEGIN 
   CASE 
   WHEN score<=100 AND score<=90 THEN SELECT 'A';
   WHEN score>=90 THEN SELECT 'B';
   WHEN score>=80 THEN SELECT 'C';
   WHEN score>=60 THEN SELECT 'D';
   ELSE SELECT 'D';
   END CASE;
END $

CALL test_case(95)$


#if结构
/*
  实现多重分支
  语法:
  if 条件1 then 语句1;
  elseif 条件2 then 语句2;
  ...
  [else 语句n;]
  end if;
  
  只能用在begin end中 
*/
#创建存储过程,根据传入的成绩,来返回等级,90-100 A 80-90B 60-90 C 否则D
CREATE FUNCTION test_if(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 test_if(80)$


#二、循环结构
/*
 while loop repeat
 
 循环控制:
 iterate: 类似于continue,
 leave:类似于break 
*/

#while
/*
  [标签:]while 循环条件 do
    循环体;
  end while[标签];
  
  # 标签是为添加循环控制

*/
#loop
/*
 [标签:]loop
    循环体;
  end loop[标签];
  可用来模拟简单的死循环

*/

#repeat
/*
[标签:]repeat
    循环体;
  until 结束循环的条件
  end repeat[标签];
*/
# 批量插入,根据设置的次数,插入admin多条记录
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),'666');
      SET i=i+1;
    END WHILE;
END $

CALL pro_while(10)$

#2. 添加leave语句
# 批量插入,根据设置的次数,插入admin多条记录,如果次数>20,则停止
CREATE PROCEDURE test_while(IN insertCount INT)
BEGIN 
   DECLARE i INT DEFAULT 1;#声明并输出话 
   a:WHILE i<=insertCount DO
      INSERT INTO admin(username,PASSWORD) VALUES (CONCAT('xiaohua',i),'666');
      IF i>=20 THEN LEAVE a;
      END IF;
      SET i=i+1;
    END WHILE a;
END $

CALL test_while(10)$


#3.添加iterate
# 批量插入,根据设置的次数,插入admin多条记录,直插入偶数次
CREATE PROCEDURE test_iterate1(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('xiao',i),'666');      
    END WHILE a;
END $

CALL test_iterate1(10)$

SELECT * FROM admin WHERE username LIKE 'xiao2';
上一篇 下一篇

猜你喜欢

热点阅读