zoukankan      html  css  js  c++  java
  • MySQL学习笔记之流程控制

    一、分支结构

      1. if函数
      语法:if(表达式1,表达式2,表达式3)
      如果表达式1成立,则返回表达式2的值,否则返回表达式3的值
      mysql> select if(2<3,'True','False');
      +------------------------+
      | if(2<3,'True','False') |
      +------------------------+
      | True                   |
      +------------------------+
      1 row in set (0.00 sec)
    
      mysql> select if(2>3,'True','False');
      +------------------------+
      | if(2>3,'True','False') |
      +------------------------+
      | False                  |
      +------------------------+
      1 row in set (0.00 sec)
    
      2. case结构
      case 有两种用法:
            ① 语法:
            case 表达式|变量|字段
            when 判断的值1 then 返回值1
            when 判断的值2 then 返回值2
            ...
            when 判断的值n then 返回值n
            else 返回值
            end case
            ② 语法:
            case
            when 条件1 then 返回值1或语句1
            when 条件2 then 返回值2或语句2
            ...
            when 条件n then 返回值n或语句n
            else 返回值或语句
            end case
            如果作为表达式使用,case结构可以在任何地方使用,如果作为独立的语句使用,则只能放在begin...end中使用。
            例1:作为表达式使用
            mysql> select name,case gender when 1 then '男' when 2 then '女' else '未知' end 性别 from students;
            +-----------+--------+
            | name      | 性别   |
            +-----------+--------+
            | 李四      | 男     |
            | 周芷若    | 女     |
            | 赵敏      | 女     |
            | Lucy      | 女     |
            | Tony      | 男     |
            | Lucy      | 女     |
            | 萧峰      | 男     |
            +-----------+--------+
            7 rows in set (0.00 sec)
    
            例2:作为独立语句使用
            mysql> delimiter $$
            mysql> create procedure get_students_grade(in name varchar(20),in subject varchar(20))
                  -> begin
                  -> declare su_score int default 0;
                  -> select s.score into su_score from students st left join score s on st.id=s.student_id left join subject su on su.id=s.subject_id where st.name=name and su.name=subject;
                  -> case 
                  -> when su_score >= 90 then select '优秀';
                  -> when su_score >= 80 then select '良好';
                  -> when su_score >= 60 then select '及格';
                  -> else select '不及格';
                  -> end case;
                  -> end $$
            Query OK, 0 rows affected (0.11 sec)
    
            mysql> delimiter ;
            mysql> call get_students_grade('周芷若','数学');
            +-----------+
            | 不及格    |
            +-----------+
            | 不及格    |
            +-----------+
            1 row in set (0.00 sec)
    
      3. if结构
            语法:
            if expr1 then 语句1
            elseif expr2 then 语句2
            ...
            [else 语句n]
            end if;
            if结构只能在begin...end中使用
            mysql> delimiter $$
            mysql> create procedure getGradre(in score int)
                  -> begin
                  -> if score >= 90 then select 'A';
                  -> elseif score >= 80 then select 'B';
                  -> elseif score >= 60 then select 'C';
                  -> else select 'D';
                  -> end if;
                  -> end $$
            Query OK, 0 rows affected (0.02 sec)
    
            mysql> delimiter ;
            mysql> call getGradre(85);
            +---+
            | B |
            +---+
            | B |
            +---+
            1 row in set (0.00 sec)
    

    二、循环结构
    MySQL的循环结构分为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 [标签]
    

    三、MySQL循环结构使用示例

      1. 创建测试表
      create table admin(
            id int auto_increment primary key,
            name varchar(20),
            passwd char(32)
      ) engine=innodb default charset=utf8mb4 collate=utf8mb4_unicode_ci;
    
      2. 创建存储过程,使用while循环结构,批量插入指定数量的数据
      set autocommit = 0;#关闭事务的自动提交
      delimiter $
      create procedure insertAdmin(in insertCount int)
      begin
            declare i int default 1;
            start transaction;
            while insertCount >= i do
            insert into admin(name,passwd) values(concat('abcd',i),md5('aaaa'));
            set i = i+1;
            end while;
            commit;
      end $
      delimiter ;
      call insertAdmin(2);
    
      mysql> select * from admin;
      +----+-------+----------------------------------+
      | id | name  | passwd                           |
      +----+-------+----------------------------------+
      |  1 | abcd1 | 74b87337454200d4d33f80c4663dc5e5 |
      |  2 | abcd2 | 74b87337454200d4d33f80c4663dc5e5 |
      +----+-------+----------------------------------+
      2 rows in set (0.00 sec)
    
      3. 创建存储过程,使用loop循环结构,批量插入指定数量的数据
    
      delimiter $
      create procedure insertAdminLoop(in insertCount int)
      begin
            declare i int default 1;
            loopName:loop
                  insert into admin(name,passwd) values(concat('efgh',i),md5('bbbb'));
                  if insertCount <= i then leave loopName;
                  end if;
                  set i = i+1;
            end loop loopName;
            commit;
      end $
      delimiter ;
      call insertAdminLoop(2);
    
      4. 创建存储过程,使用repeat循环结构,批量插入指定数量的数据
    
      mysql> delimiter $
      mysql> create procedure insertAdminRepeat(in insertCount int)
            -> begin
            -> declare i int default 1;
            -> repeat
            -> insert into admin(name,passwd) values(concat('fwcweAX',i),md5(concat('sdfewf',i)));
            -> set i = i+1;
            -> until insertCount < i
            -> end repeat;
            -> commit;
            -> end $
      Query OK, 0 rows affected (0.01 sec)
    
      mysql> delimiter ;
    

    四、使用存储函数和存储过程灌入数据

      1. 创建部门表
      create table dept(
            id int auto_increment primary key,
            deptName varchar(30) default null,
            address varchar(40) default null
      )engine=innodb default charset=utf8mb4 collate=utf8mb4_unicode_ci;
    
      2. 创建员工信息表
      create table emp(
            id int auto_increment primary key,
            name varchar(20) default null,
            age tinyint(3) default null,
            deptid int default null,
            empno int not null,
            key idx_dept_id (deptid)
      )engine=innodb default charset=utf8mb4 collate=utf8mb4_unicode_ci;
    
      3. 创建函数,获取随机字符串
      delimiter $
      create function rand_str(n int) returns varchar(255) reads sql data
      begin
            declare chars_str varchar(60) default 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
            declare return_str varchar(60) default '';
            declare i int default 1;
            while i <= n do
                  set return_str = concat(return_str,substr(chars_str,floor(rand()*52+1),1));
                  set i = i+1;
            end while;
            return return_str;
      end $
    
      4. 创建函数,获取部门随机编号
      create function rand_number(from_num int,to_num int) returns int no sql
      begin
            declare i int default 0;
            set i = floor(from_num + rand() * (to_num - from_num + 1));
            return i;
      end $
    
      5. 创建存储过程,批量插入员工信息数据
      create procedure insertEmp(in start_num int, in end_num int)
      begin
            declare i int default 0;
            declare name_len int default 1;
            set name_len = floor(5 + rand()*6);
            set autocommit = 0;
            start transaction;
            repeat
                  set i = i+1;
                  insert into emp(name,age,deptid,empno) values(rand_str(name_len),rand_number(30,50),rand_number(1,100000),(start_num+i));
                  until end_num <= i
            end repeat;
            commit;
            set autocommit=1;
      end $
      call insertEmp(100000,5000000);
    
      6. 创建存储过程,批量插入部门信息数据
      create procedure insertDept(in total int)
      begin
            declare i int default 0;
            declare deptName_len int default 1;
            declare addr_len int default 1;
            set deptName_len = floor(6+rand()*7);
            set addr_len = floor(10+rand()*11);
            set autocommit = 0;
            start transaction;
            repeat
                  set i = i+ 1;
                  insert into dept(deptName,address,ceo) values(rand_str(deptName_len),rand_str(addr_len),rand_number(1,5000000));
            until i>=total
            end repeat;
            commit;
            set autocommit=1;
      end $
      call insertDept(100000);
  • 相关阅读:
    cnblog项目--20190309
    django js引入失效问题
    Python老男孩 day16 函数(六) 匿名函数
    Python老男孩 day16 函数(五) 函数的作用域
    Python老男孩 day15 函数(四) 递归
    Python老男孩 day15 函数(三) 前向引用之'函数即变量'
    Python老男孩 day15 函数(二) 局部变量与全局变量
    Python老男孩 day14 函数(一)
    Python老男孩 day14 字符串格式化
    Python老男孩 day14 集合
  • 原文地址:https://www.cnblogs.com/huige185/p/14075616.html
Copyright © 2011-2022 走看看