132.【MySQL_进阶】(七)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 132.【MySQL_进阶】

8.存储过程_case (选择结构)

(1).case_语法

1.第一种语法:

case 表达式
  when 条件1 then 执行语句1
  [when 条件2 then 执行语句2]...
  [else 执行语句n]
end case;

2.第二种语法:

case
  when 条件1 then 执行语句1
  [when 条件2 then 执行语句2]...
  [else 执行语句n]
end case;
(2).case_示列
  1. 根据传入的月份,判断月份所属的季节(要求采用case结构)。
-- 1-3月份 第一节度。 4-6月份 第二季度 7-9 为第三季度 
create procedure p7(in `month` int, out seat varchar(10))
begin
  -- 1.设置月份
  case 
    when `month`>=1 and `month`<=3 then
      set seat := '第一季度';
    when `month`>=4 and `month`<=6 then
      set seat := '第二季度';
    when `month`>=7 and `month`<=9 then
      set seat := '第三季度';
    when `month`>=10 and `month`<=12 then
      set seat := '第四季度';
  end case;
end;
-- 2.调用函数
call p7(5,@seat1);
-- 3.查询用户变量
select @seat1;

9.存储过程_while (循环结构)

(1).while_语法

while 循环时有条件的循环控制语句。满足条件后,再执行循环体中的SQL语句。

# 先判定条件,如果条件为true,则执行逻辑,否则,不执行逻辑
while 条件 do
  SQL逻辑...
end while;
(2).while_示列
  1. 计算从1累加到100的值.
-- 1.定义局部变量,
create procedure p9()
begin
  # 1.1 创建局部变量
  declare count int default 0;
  # 1.2循环
  while count<=100 do
  # 1.3进行累加
    set count := `count`+1;
  end while;
  select count;
end;
#查看
call p9;

10.存储过程_repeat (循环结构)

(1).repeat_语法

repeat是有条件的循环控制语句,当满足条件的时候退出循坏。具体语法:

先执行一次逻辑,然后判定逻辑是否满足,如果满足,则退出;如果不满足,则继续下一次循环。 (类似于Java的 do while(){})

repeat
  SQL逻辑...;
  until 条件   #这里不能有分号
end repeat;
(2).repeat_示列
  1. 计算从1累加到n得值,n为传入的参数值。
-- 1.函数
create procedure p10(in n int)
begin
  -- 2.创建一个局部变量并设置默认值为0
  declare total int default 0;
  -- 3.设置repeat
  repeat
      set total :=total +1;
      set n := n-1;
  until n<=0 
  end repeat;
  -- 查询
    select total;
end;
call p10(10);

11.存储过程_loop (循环结构)

(1).loop_语法

loop 实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用其来实现简单的死循环。Loop可以配合一个两个语句使用:

  1. leave: 配合循环使用,退出循环。 类似于 break;
  2. iterate: 必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一次循环。类似于 continue;
[开始标签]: loop
  SQL逻辑...
end loop [结束标签];
leave 标签;  -- 退出指定标记的循环体
iterate 标签; -- 直接进入下一次循环
(2).loop_示列
  1. 计算从1到n偶数累加的值,n为传入的参数值。
create procedure p1(in n int)
begin
  -- 1. 声明一个局部变量
  declare total int default 0;
  -- 2. 进行循环的操作
  sum:loop
  -- 3. 判断是否小于0 离开
  if n<0 then 
    leave sum;
  end if;
  -- 4. 假如是奇数的话,跳过  
  if n%2 = 1  then 
    set n := n-1;
    iterate sum;
  end if;
  -- 5. 加在一起
  set total := total +n;
  set n := n-1;
  end loop sum;
  select total;
end;
call p1(10);

12.存储过程_cursor (游标)

(1).游标_介绍

游标(cursor) 是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、open、fetch 和 close。 相当于说就是能够存储数组了

(2).游标_语法

1.声明游标

declare 游标名称 cursor for 查询语句;

2.打开游标

open 游标名称;

3.获取游标记录

fetch 游标名称 into 变量 [,变量...];

4.关闭游标

close 游标名称;
(3).游标_示列

根据传入的参数uage,来查询用户表tb_user中,所有的用户年龄小于等于uage的用户姓名(name)和专业(profession),并将用户的姓名和专业插入到所创建的一张新表(id,name,profession)中.。

create procedure p1(in uage int)
begin
  -- 1. 声明接受的值。
  declare uname varchar(100);
  declare uprofession varchar(100);
  -- 2.声明游标
  declare u_cursor cursor for select `name`,`profession` from tb_user2 where `age`<=uage;
  -- 3.如果表不存在就创建
  drop table if exists tb_user_proinfo;
  create table if not exists tb_user_proinfo(
    id int(4) primary key auto_increment,
    name varchar(100),
    profession varchar(100)
  );
  -- 4.开启游标
  open u_cursor;
  -- 5. 循环
  WHILE true DO
  -- 6.将数据插入信息
  fetch u_cursor into uname,uprofession;
  -- 7. 插入新建的表中
  insert into tb_user_proinfo values (null,uname,uprofession);
  END WHILE;
  -- 8. 关闭游标
  close u_cursor;
end;
call p1(100);
select *from tb_user_proinfo;

1.普通变量要比游标变量先声明

2.执行函数,但会报错。报错的原因当我们从游标读出来之后,还是一直循环的,所以会报错。

3.数据能够加入,但是调用函数的时候会报错

13.存储过程_handler(条件处理程序)

(1).条件处理程序_介绍

条件处理程序(Handler) 可以用来定义在流程控制结构执行过程中遇到的问题时相应的处理步骤。类似于 try catch(){}

(2).条件处理程序_语法
declare 处理程序类型 handler for 条件 [,条件2] ... SQLStatement;
处理程序类型:
 1. continue: 继续执行当前程序
 2. exit: 终止当前程序
条件:
 sqlstate sqlstate_value: 状态码 如02000
 1. sqlwarning: 所有以01开头的sql状态码
 2. not forun: 所有以02开头的sql状态码
 3. sqlexception: 所有没有被01 或02 开头的状态码。
(3).修复游标残留下的问题
create procedure p1(in uage int)
begin
  -- 1. 声明接受的值。
  declare uname varchar(100);
  declare uprofession varchar(100);
  -- 2.声明游标  
  declare u_cursor cursor for select `name`,`profession` from tb_user2 where `age`<=uage;
  -- 声明条件处理程序,当状态码为0200的时候退出并关闭游标 ⭐
  declare exit handler for sqlstate '02000'close u_cursor;
  -- 3.如果表不存在就创建
  drop table if exists tb_user_proinfo;
  create table if not exists tb_user_proinfo(
    id int(4) primary key auto_increment,
    name varchar(100),
    profession varchar(100)
  );
  -- 4.开启游标
  open u_cursor;
  -- 5. 循环
  WHILE true DO
  -- 6.将数据插入信息
  fetch u_cursor into uname,uprofession;
  -- 7. 插入新建的表中
  insert into tb_user_proinfo values (null,uname,uprofession);
  END WHILE;
  -- 8. 关闭游标 ⭐⭐
  # close u_cursor;
end;
call p1(100);
select *from tb_user_proinfo;

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
SQL 关系型数据库 MySQL
【MySQL进阶之路丨第十四篇】一文带你精通MySQL重复数据及SQL注入
【MySQL进阶之路丨第十四篇】一文带你精通MySQL重复数据及SQL注入
51 0
|
3月前
|
存储 关系型数据库 MySQL
【MySQL进阶之路丨第十三篇】一文带你精通MySQL之ALTER命令及序列使用
【MySQL进阶之路丨第十三篇】一文带你精通MySQL之ALTER命令及序列使用
41 0
|
3月前
|
机器学习/深度学习 SQL 关系型数据库
【MySQL进阶之路丨第十一篇】一文带你精通MySQL NULL值处理、正则表达式
【MySQL进阶之路丨第十一篇】一文带你精通MySQL NULL值处理、正则表达式
39 0
|
4月前
|
关系型数据库 MySQL 数据库
深入MySQL数据库进阶实战:性能优化、高可用性与安全性
深入MySQL数据库进阶实战:性能优化、高可用性与安全性
153 0
|
3月前
|
SQL 关系型数据库 MySQL
【MySQL进阶之路丨第十五篇】一文带你精通MySQL数据的导入与导出
【MySQL进阶之路丨第十五篇】一文带你精通MySQL数据的导入与导出
55 0
【MySQL进阶之路丨第十五篇】一文带你精通MySQL数据的导入与导出
|
4月前
|
SQL 关系型数据库 MySQL
MySQL进阶之性能优化与调优技巧
MySQL进阶之性能优化与调优技巧
|
1天前
|
SQL 关系型数据库 MySQL
MySQL数据库的约束+进阶版新增与查询-2
MySQL数据库的约束+进阶版新增与查询
11 1
|
3月前
|
SQL 关系型数据库 MySQL
【JavaEE进阶】 数据库连接池与MySQL企业开发规范
【JavaEE进阶】 数据库连接池与MySQL企业开发规范
|
3月前
|
SQL 监控 关系型数据库
MySQL Binlog深度解析:进阶应用与实战技巧【进阶应用】
MySQL Binlog深度解析:进阶应用与实战技巧【进阶应用】
46 0
|
3月前
|
关系型数据库 MySQL 数据库
【MySQL进阶之路丨第十七篇(完结)】一文带你精通MySQL运算符
【MySQL进阶之路丨第十七篇(完结)】一文带你精通MySQL运算符
23 0