132.【MySQL_进阶】(六)

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

(五)、存储过程 (Procedure)

1.存储过程介绍

存储过程是实现经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据的效率还是有好处的。

存储过程思想上很简单,就是数据库SQL语言层面的代码封装与重用

(1).存储过程_特点
  1. 封装、复用。
  2. 可以接收参数,也可以返回数据。
  3. 减少网络交互,效率提升。

2.存储过程_基本语法

(1).存储过程_创建
create procedure 存储过程名称([参数列表])
begin
    --SQL语句
end;
(2).存储过程_调用
call 名称([参数])
(3).存储过程_查看

1.查询指定数据库的存储过程及状态信息

select *from infommation_schema.routines where routine_schema='数据库名';

2.查询某个存储过程的定义

show create procedure 存储过程名称;
(4).存储过程_删除
drop procedure [if exists] 存储过程名称;
(5).存储过程示列
-- 存储过程基本语法
-- 1.创建
create procedure p1()
begin
    select count(*) from student;
end;
-- 2.调用
call p1();
-- 3.查看
select *from information_schema.ROUTINES where routine_schema = 'itheima';
show create procedure p1;
-- 4.删除
drop procedure if exists p1;

(6).命令行创建存储过程

注意: 在命令行中,执行创建存储过程的SQL时,需要通过关键字 delimiter 指定SQL的结束符。

delimiter 指定符号;   ->以指定符号为结束语句
-- 1.命令行方式不让创建,原因分号不对
create procedure p2()
begin
    select count(*) from student;
end;
-- 2. 修改结尾命令符号之后再次进行创建
delimiter $$;
create procedure p2()
begin
    select count(*) from student;
end$$
-- 最后一定要恢复成分号
delimiter ;

3.存储过程_系统变量

(1).什么是系统变量

系统变量 是 MySQL服务器提供,不是用户定义的,属于服务器层面。分为全局变量(GLOBAL)、会话变量(SESSION)。

(2).查看系统变量

1.查看所有系统变量

show [session|global] variables;

2.可以通过like模糊匹配方式查找变量

show [session|global] variables like '...'

3.查看指定变量的值

select @@[session|global] 系统变量名;
(3).设置系统变量
set [session|global] 系统变量名 = 值;
set @@[session|global] 系统变量 = 值;
(4).系统变量演示
-- 变量 系统变量
-- 1.查看所有的系统变量
show variables;
-- 模糊匹配查看系统变量
show session variables like 'auto%';
-- 查找指定变量的值信息
select @@session.autocommit;
-- 2.设置系统变量
set session autocommit =1;

注意:

  1. 如果没有指定session/global,默认是session,会话变量。
  2. mysql服务重启之后,所设置的全局参数会失效,想要不失效的,可以在 my.inf 中进行配置。

4.存储过程_用户变量

(1).用户变量_介绍

用户定义变量 是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用 "@变量名"使用就可以。其作用域为当前连接两个@是系统变量,一个@是用户变量

(2).用户变量_赋值

1.使用等号赋值

set @varn_name=expr[,@var_name=expr]...;

2.使用 :=进行赋值

set @var_name:=expr[,@var_name:=expr]...;

3.使用seelect 进行赋值

select @var_name:=expr[,@var_name:=expr]...;

4.将返回的字段放进变量中

select 字段名 into @var_name from 表名;
(3).用户变量_使用
select @var_name;
(4).用户变量_示列
-- 变量: 用户变量
-- 赋值
set @myname = 'itheima';
set @myage := 10;
set @mygender := '男',@myhobby :='java';
select @mycolor := '中国红';
select count(*) into @myId FROM student;  #不能是数组,只能是一个单值
-- 使用
select @myname,@myage,@mygender,@myhobby;

注意:

用户定义的变量无需对其进行声明或初始化,只不过获取到的值为null。

5.存储过程_局部变量

(1).局部变量_介绍

局部变量 是根据需要定义的局部生效的变量,访问之前,需要declare声明。可用作存储过程内的局部变量和输入参数局部变量的范围是在其内声明的begin ..end块

(2).局部变量_声明
declare 变量名 变量类型[default ...];

变量类型就是数据库字段类型: int 、bigint、char、varchar、date、time等。

(3).局部变量_赋值
-- 1.第一种
set 变量名=值;
-- 2.第二种
set 变量名:=值;
-- 3.第三种
select 字段名 into 变量名 from 表名...;
(4).局部变量_查看
select 局部变量名;
(5).局部变量_示列
-- 1.声明
create procedure p3()
begin
    #声明局部变量 stu_count默认为0
    declare stu_count int default 0;
    #赋值
    set stu_count := 100;
    select stu_count;
end;
call p3();

6.存储过程_if (选择结构)

(1).if_语法
if 条件1 then
...
elseif 条件2 then 
...
else
...
end if;
(2).if_示列

根据定义的分数score变量,判定当前分数对应的分数等级。

  1. score >= 85分,等级为优秀。
  2. score>=60分 且 score <85分,等级为及格。
  3. score<60分,等级为不及格。
-- if
-- 根据定义的分数score变量,判断当前分数对应的分数等级
create procedure p3()
begin
    -- 定义分数并写死
    declare `score` int default 58;
    -- 定义返回值
    declare `result_value` varchar(10);
    if score >=85 then
      set result_value := '优秀';
    elseif score >=60 then
      set result_value := '及格';
    else
      set result_value := '不及格';
    end if;
    #查询
    select result_value;
end;
call p3;

7.存储过程_参数(in,out,inout)

(1).三大参数介绍
类型 含义 默认
in 该参数作为输入,也就是需要调用时传入值 备注
out 该类参数作为输出,也就是该参数可以作为返回值
inout 即可以作为输入参数,也可以作为输出参数
(2).参数_用法
create procedure 存储过程名称([in/out/inout 参数名 参数类型])
begin
  -- SQL语句
end;
(3).参数_示列
  1. 根据传入参数score,判定当前分数对应的分数等级,并返回
-- 根据定义的分数score变量,判断当前分数对应的分数等级
#设置传入的参数 和 输出的参数 ⭐
create procedure p4(in `score` int,out result_value varchar(10)) 
begin
    if score >=85 then
      set result_value := '优秀';
    elseif score >=60 then
      set result_value := '及格';
    else
      set result_value := '不及格';
    end if;
end;
# 2.第一个是 传入的值。第二个是 接受的变量(用户变量) ⭐⭐
call p4(70,@result); 
-- 3.查看返回的变量
select @result; ⭐⭐⭐
  1. 传入的200分制的分数,进行转换为百分制,并返回
-- 1.设置输入输出函数
create procedure p5(inout score float)
begin
  set score := score/2;
end;
-- 2.先设置默认值
set @score_a =149;
-- 3.传入参数并接收值
call p5(@score_a);
-- 4.查看返回值
select @score_a;


相关实践学习
基于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注入
48 0
|
3月前
|
存储 关系型数据库 MySQL
【MySQL进阶之路丨第十三篇】一文带你精通MySQL之ALTER命令及序列使用
【MySQL进阶之路丨第十三篇】一文带你精通MySQL之ALTER命令及序列使用
41 0
|
3月前
|
机器学习/深度学习 SQL 关系型数据库
【MySQL进阶之路丨第十一篇】一文带你精通MySQL NULL值处理、正则表达式
【MySQL进阶之路丨第十一篇】一文带你精通MySQL NULL值处理、正则表达式
38 0
|
4月前
|
关系型数据库 MySQL 数据库
深入MySQL数据库进阶实战:性能优化、高可用性与安全性
深入MySQL数据库进阶实战:性能优化、高可用性与安全性
138 0
|
3月前
|
SQL 关系型数据库 MySQL
【MySQL进阶之路丨第十五篇】一文带你精通MySQL数据的导入与导出
【MySQL进阶之路丨第十五篇】一文带你精通MySQL数据的导入与导出
52 0
【MySQL进阶之路丨第十五篇】一文带你精通MySQL数据的导入与导出
|
4月前
|
SQL 关系型数据库 MySQL
MySQL进阶之性能优化与调优技巧
MySQL进阶之性能优化与调优技巧
|
3月前
|
SQL 关系型数据库 MySQL
【JavaEE进阶】 数据库连接池与MySQL企业开发规范
【JavaEE进阶】 数据库连接池与MySQL企业开发规范
|
3月前
|
SQL 监控 关系型数据库
MySQL Binlog深度解析:进阶应用与实战技巧【进阶应用】
MySQL Binlog深度解析:进阶应用与实战技巧【进阶应用】
45 0
|
3月前
|
关系型数据库 MySQL 数据库
【MySQL进阶之路丨第十七篇(完结)】一文带你精通MySQL运算符
【MySQL进阶之路丨第十七篇(完结)】一文带你精通MySQL运算符
23 0
|
3月前
|
SQL 机器学习/深度学习 关系型数据库
【MySQL进阶之路丨第十六篇】一文带你精通MySQL函数
【MySQL进阶之路丨第十六篇】一文带你精通MySQL函数
35 0