首页 > 数据库 >MYSQL 存储过程

MYSQL 存储过程

时间:2023-09-07 20:25:17浏览次数:39  
标签:存储 end -- age stu student MYSQL 过程 select

存储过程

1、定义:

  • 存储过程是一组为了完成特定功能的 SQL 语句集,存储在数据库中,经过第一次编译后调用不需要再次编译,用户通过指定存储过程的名字并给出参数来执行它。存储过程是数据库中的一个重要对象。

2、存储过程特点:

  1. 能完成较复杂的判断和运算
  2. 可编程性强,灵活
  3. SQL 编程的代码可重复使用
  4. 执行的速度相对较快
  5. 减少网络之间的数据传输,节省开销

3、简单的存储过程

简单语法

create procedure 名称()
begin
.........
end

简单存储过程示例

create procedure test1()
begin
    select * from student;
    select * from teacher;
end;

调用存储过程

call test1();  

4、存储过程的变量

通过一个简单的例子来学习变量的声明和赋值

create procedure test2()
begin
  -- 使用 declare语句声明一个变量
  declare inpunt_stu_no varchar(10) default '';
  declare out_stu_name varchar(20) default '';
  -- 使用set语句给变量赋值
  set inpunt_stu_no = 'stu_01';
  -- 将users表中id=1的名称赋值给username
  select stu_name into out_stu_name from student where stu_no = inpunt_stu_no;
  -- 返回变量
  select out_stu_name;
end;

存储过程解析:

  1. 变量的声明使用 declare ,一句 declare 只声明一个变量,变量必须先声明后使用;
  2. 变量具有数据类型和长度,与 mysql 的 SQL 数据类型保持一致;
  3. 变量可以通过 set 来赋值,也可以通过 select into 的方式赋值;
  4. 变量需要返回,可以使用 selec t语句,如:select 变量名

5、变量的作用域

  1. 变量作用域说明

    存储过程中变量是有作用域的,作用范围在 begin 和 end 块之间需要多个块之间传值,可以使用全局变量,即放在所有代码块之前传参变量是全局的,可以在多个块之间起作用

  2. 用实例来说明变量的作用域

    create procedure test3()
        begin
          begin
            declare student_count int default 0; -- 学生数量
            select count(*) into student_count from student;
            select student_count; -- 返回学生数量
          end;
          begin 
            declare max_age int default 0; -- 最大金额
            declare min_age int default 0; -- 最小金额
            select max(age) into max_age from student;
            select min(age) into min_age from student;
            select student_count,max_age,min_age; -- 返回学生数量、最大年龄、最小年龄
           end;
        end;
    -- 总结:当创建成功,call test3,系统报错如下
    [SQL]call test3
    [Err] 1054 - Unknown column 'student_count' in 'field list'

    将student_count改为全局变量

    create procedure test4()
        begin
          declare student_count int default 0; -- 学生数量
          begin
            select count(*) into student_count from student;
            select student_count; -- 返回学生数量
          end;
          begin 
            declare max_age int default 0; -- 最大金额
            declare min_age int default 0; -- 最小金额
            select max(age) into max_age from student;
            select min(age) into min_age from student;
            select student_count,max_age,min_age; -- 返回学生数量、最大年龄、最小年龄
           end;
        end;

6、存储过程参数

1、基本语法

create procedure 名称([IN|OUT|INOUT] 参数名 参数数据类型 )
begin
.........
end

2、存储过程的三种传参【in、out、inout】

create procedure test5(in student_id int,out student_age int ,inout student_name varchar(20))
begin
    select age,stu_name into student_age,student_name from student where id=student_id;
end;

存储过程解析:

  1. IN类型参数一般只用于传入,默认就是IN类型
  2. out是传出参数,不能用于传入参数值
  3. INOUT参数集合了IN和OUT类型的参数功能,即可以传入也可以传出

7、

存储过程条件语句

1、基本结构

-- 单条件
if() then...else...end if;
-- 多条件
if() then...
elseif() then...
else ...
end if;

条件语句示例(这次考试,年龄小于20岁的学生每科+10分,小于23岁的学生每科-5分,大于23岁的学生+5)

create procedure test6(in in_stu_no int)
begin
   declare my_age int default 0;
   select age into my_age from student where stu_no=in_stu_no;
   if(my_age < 20)
   then 
       update score set stu_score=stu_score+10 where stu_no=in_stu_no;
    elseif(my_age < 23)
    then 
       update score set stu_score=stu_score-5 where stu_no=in_stu_no;
    else 
       update score set stu_score=stu_score+10 where stu_no=in_stu_no;
    end if;
end;

8、存储过程循环语句

1、while语句的基本语法

while(表达式) do 
   ......  
end while;

while语句示例(这里stu_no数据库设计不能重复,采用了concat()函数进行拼接)

create procedure test7()
begin
  declare i int default 0;
  while(i<10) do 
    begin 
        select i;
        set i=i+1;  
        insert into student(stu_no,stu_name) values(concat('test_',i),'test');
     end;
  end while;
end;

 

标签:存储,end,--,age,stu,student,MYSQL,过程,select
From: https://www.cnblogs.com/yund/p/17685938.html

相关文章

  • 高性能存储 SIG 月度动态:erofs 新增支持多个重要特性,持续构建容器场景竞争力
    高性能存储 SIG(SpecialInterestGroup)目标:存储领域的发展历程,本质上是存储介质与软件栈相互促进发展的过程。高性能存储SIG致力于存储栈性能挖掘,当前主要聚焦内核io_uring技术优化异步IO性能,使用持久化内存提升业务单成本性能,容器场景存储技术优化等课题。高性能存储SIG......
  • 虹科产品|HK-TrueNAS开放式存储平台被评为数字公益产品
    HK-TrueNAS被评为数字公益产品数字公共产品联盟(DigitalPublicGoodsAlliance)是一项多方利益相关者倡议,旨在促进数字公益(DPG)的发现、开发、使用和投资。数字公共产品的定义是所有人都能免费获取的资源或服务,它能为个人和整个社会带来至关重要的利益。数字公益的例子包括开源软件......
  • 什么是网络存储服务器
    网络存储器就像一台只有存储功能的终端,独立地工作,里面带有固定的系统,但可以自己设置部分参数功能,可以接入服务器或者电脑进行设置,网络存储服务器实际上就是精简的、小型化的服务器,同样由主板、CPU(Soc,芯片级系统、内存、网络芯片等组成•虽然它是从服务器的基础上简化而来,但功能依......
  • 详解canal同步MySQL增量数据到ES
    这篇文章,将使用canal将MySQL增量数据同步到ES 。如果想学Java项目的,强烈推荐我的......
  • Mysql更新时间列只改日期为指定日期不更改时间
    场景Mysql分表后同结构不同名称表之间复制数据以及Update语句只更新日期加减不更改时间:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/132342164上面通过如下方式实现日期列增加指定天数。UPDATEbus_vehicle_position_record20230801SETrecord_date=DATE_AD......
  • 视频监控/安防监控/视频云存储EasyCVR平台设备分配模块升级详解
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台支持将部署在监控现场的前端设备进行统一集中接入,可兼容多协议、多类型设备,管理员可选择任意一路或多路视频实时观看,视频画面支持单画面、多画面显示,视频窗口数量有1、4、9、16个可选,还能支持视频轮巡播放。平台分发的视频流......
  • #yyds干货盘点#Mysql慢查询日志
    Mysql慢查询日志数据库的慢查询是影响项目性能的一大因素,对于数据库我们要优化SQL,首先要找到需要优化的SQL,这就需要我们知道sql执行时间等信息,除了使用SHOWPROFILES;外,mysql也提供了“慢查询日志”功能,用来记录查询时间超过某个设定值的SQL,这将极大程度帮助我们快速定位到症结所在......
  • 40 分钟内同步 500GB MySQL 数据至 Doris
    随着数据分析在业务决策中变得日益重要,数据实时同步和分析成为企业提升竞争力的关键。MySQL作为广泛使用的关系型数据库,其数据存储丰富,但无法满足大规模数据分析和高并发查询的需求。而Doris作为一款专为大数据分析设计的分布式数据仓库,具有高性能、可扩展的特点,其优异的数据处......
  • 视频监控/安防监控/视频云存储EasyCVR平台设备分配模块升级详解
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台支持将部署在监控现场的前端设备进行统一集中接入,可兼容多协议、多类型设备,管理员可选择任意一路或多路视频实时观看,视频画面支持单画面、多画面显示,视频窗口数量有1、4、9、16个可选,还能支持视频轮巡播放。平台分发的视频流......
  • kubernetes deploy standalone mysql demo
    kubernetes集群内部署单节点mysqlansibleall-mshell-a"mkdir-p/mnt/mysql/data"catmysql-pv-pvc.yamlapiVersion:v1kind:PersistentVolumemetadata:name:mysql-pv-volumelabels:type:localspec:storageClassName:manualcapacity:s......