132.【MySQL_进阶】(七)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
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;

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
存储 SQL 关系型数据库
MySQL语句详解:从基础到进阶的全面指南
MySQL语句详解:从基础到进阶的全面指南
|
6月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第三篇(MySQL性能优化)
MySQL数据库进阶第三篇(MySQL性能优化)
|
6月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
|
6月前
|
SQL 关系型数据库 MySQL
MySQL数据库进阶第五篇(锁)
MySQL数据库进阶第五篇(锁)
|
6月前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(2)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
6月前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(1)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
5月前
|
存储 关系型数据库 MySQL
MySQL数据库开发进阶:精通数据库表的创建与管理22
【7月更文挑战第22天】数据库的创建与删除,数据表的创建与管理
51 1
|
6月前
|
JSON 关系型数据库 MySQL
MySQL常用函数解读:从基础到进阶的全方位指南
MySQL常用函数解读:从基础到进阶的全方位指南
|
6月前
|
SQL 关系型数据库 MySQL
Python进阶第二篇(Python与MySQL数据库)
Python进阶第二篇(Python与MySQL数据库)
|
6月前
|
存储 SQL 关系型数据库
MySQL数据库进阶第四篇(视图/存储过程/触发器)
MySQL数据库进阶第四篇(视图/存储过程/触发器)