首页 > 数据库 >MySQL之存储过程(循环)

MySQL之存储过程(循环)

时间:2023-07-23 13:12:23浏览次数:33  
标签:... 存储 set score -- 循环 MySQL select 变量

MySQL之存储过程

变量

@@是系统变量

@是用户自定义的变量

系统变量

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

查看系统变量

模板

 SHOW [ SESSION | GLOBAL] VARIABLES ;             -- 查看所有系统变量
 SHOW [SESSION|GLOBAL] VARIABLES LIKE '........'; -- 可以通过LIKE模糊匹配方式查找变量
 SELECT @@[SESSION | GLOBAL] 系统变量名;           -- 查看指定变量的值

实操

 show session variables ;
 ​
 show session variables like 'auto%';
 show global  variables like 'auto%';
 ​
 select @@autocommit;
 select @@global.autocommit;
 ​
 -- 设置系统变量
 set session autocommit = 0;


注意:

  1. 如果没有指定SESSION/GLOBAL,默认是SESSION,会话变量。

  2. mysql服务重新启动之后,所设置的全局参数会失效,要想不失效,可以在 /etc/my.cnf 中配置。


用户定义的变量

用户定义变量 是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用“@变量名”使用就可以。其作用域为当前连接(当前会话)

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

赋值

赋值建议使用 := ,因为MySQL中没有 == , = 既可以做赋值运算符,又可以做比较运算符,所以赋值建议使用 :=

 SET @var name = expr [, @var_name = expr] ... ;
 SET @var_name := expr [, @var_name := expr] ... ;
 SELECT @var name := expr [, @var_name := expr] ... ;
 SELECT 字段名 INTO @var_name FROM 表名;

使用

 SELECT @var_name ;

实操

 -- 变量:用户变量
 -- 赋值
 set @myname := 'itheng';
 set @myage := 20;
 set @mygender := '男',@myhobby := 'Java';
 ​
 -- 使用
 select @myname,@myage,@mygender,@myhobby;
 ​
 select count(*) into @mycount from tb_user;
 select @mycount;
 ​
 select @myname; #用户定义的变量无需对其进行声明或初始化,只不过获取到的值为NULL。

局部变量

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

声明

 DECLARE 变量名 变量类型[DEFAULT ...];

变量类型就是数据库字段类型:INT、BIGINT、CHAR、VARCHAR、DATE、TIME等。

赋值

 set 变量名 = 值;
 set 变量名 := 值;
 SELECT 字段名 INTO 变量名 FROM 表名...;
 -- 变量:局部变量
 -- 声明:declare
 -- 赋值
 create procedure p2()
 begin
     declare stu_count int default 0;
     select count(*) into stu_count from student;
     select stu_count;
 end;
 ​
 call p2();

存储过程语法(基于局部变量)

if

语法:

 if 条件1 then
     ...
 elseif 条件2 then     --可选
     ...
 else                --可选
     ...
 end if;

实操:

 create procedure p1()
 begin
     declare score int default 59;
     declare degree char(10) ;
     if score < 60 then
         set degree := '不及格';
     elseif score >=60 and score <85 then   #注意:elseif如果分开写,则会报错
         set degree :='及格';
     else
         set degree :='优秀';
     end if;
     select degree;
 end;
 ​
 call p1();

参数

类型 含义
IN 该类参数作为输入,也就是需要调用时传入值
OUT 该类参数作为输出,也就是该参数可以作为返回值
INOUT 既可以作为输入参数,也可以作为输出参数

用法:

 create procedure 存储过程名称([IN/OUT/INOUT参数名 参数类型])
 begin
     --SQL语句
 end;

实操:

 #给分数分等级
 create procedure p2(in score int , out degree varchar(10))
 begin
     if score < 60 then
         set degree := '不及格';
     elseif score >=60 and score <85 then   #注意:elseif如果分开写,则会报错
         set degree :='及格';
     else
         set degree :='优秀';
     end if;
     select degree;
 end;
 ​
 call p2(58,@degree);
 #将传入的200分制的分数,换算成百分制。
 create procedure p3(inout score double)
 begin
     set score = 0.5 * score;
     select @score;
 end;
 ​
 set @score = 78 ;
 call p3(@score); 
 -- 不能在p3括号里对@score进行赋值,存储过程的参数需要在 CALL 语句中指定,并且不能使用赋值操作符。

case

语法1:

 case case_balue
     when when_value1 then statement_list1
     [when when_value2 then statement_list2]...
     [else statement_list]
 end case;

语法2:

 case
     when search_condition then statement_list1
     [when search condition2 then statement_list2]....
     [else statement_list]
 end case;

实操:

 DELIMITER //
 ​
 CREATE PROCEDURE p6(IN month INT)
 BEGIN
     DECLARE result VARCHAR(10);
     CASE
         WHEN month >= 1 AND month <= 3 THEN
             SET result := '第一季度';
         WHEN month >= 4 AND month <= 6 THEN
             SET result := '第二季度';
         WHEN month >= 7 AND month <= 9 THEN
             SET result := '第三季度';
         WHEN month >= 10 AND month <= 12 THEN
             SET result := '第四季度';
         ELSE
             SET result := '非法参数';
         END CASE;
 ​
     SELECT CONCAT('您输入的月份为:', month, ',这所属的季度为:', result);
 END //
 ​
 DELIMITER ;
 call p6(5);

while

语法

while循环是有条件的循环控制语句。满足条件后,再执行循环体中的SQL语句。具体语法为:

 #先判定条件,如果条件为true,则执行逻辑,否则,不执行逻辑。
 while 条件 do
     sql逻辑...
 end while;

实操

 create procedure p7(in n int)
 begin
     declare total int default 0;
     while n > 0 do
         set total := total + n;
         set n := n - 1;
     end while;
     select total;
 end;
 ​
 call p7(10);

repeat

语法

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

 #先执行一次逻辑,然后判定逻辑是否满足,如果满足,则退出。如果不满足,则继续下一次循环。
 repeat
     sql逻辑...
     until 条件
 end repeat;

实操

 create procedure p8(in n int)
 begin
     declare total int default 0;
 ​
     repeat
         set total := total + n;
         set n := n - 1;
     until n <= 0
     end repeat;
 ​
 select total;
 end;
 ​
 call p8(10);
 

 

标签:...,存储,set,score,--,循环,MySQL,select,变量
From: https://www.cnblogs.com/liandaozhanshi/p/17574898.html

相关文章

  • go语言mysql驱动
    连接数据库是典型的CS编程,服务器端被动等待客户端建立TCP连接,并在此连接上进行特定的应用层协议。但一般用户并不需要了解这些细节,这些都被打包到了驱动库当中,只需要简单的调用打开就可以指定协议连接到指定的数据库。数据库的种类和产品太多,协议太多,Go官方很难提供针对不同数据......
  • mysql auto_increment怎么删除
    MySQL中的auto_increment如何删除在MySQL中,auto_increment是一个非常有用的功能,它允许我们在插入数据时自动为表的主键字段生成唯一的递增值。然而,有时候我们可能需要删除表中的某些数据行,这就会导致auto_increment值出现断层。本文将介绍如何在MySQL中删除数据行时保持auto_incre......
  • mysql rpm包选择
    MySQLRPM包选择MySQL是一种流行的关系型数据库管理系统,被广泛用于开发和生产环境中。在Linux系统上安装MySQL,我们可以选择使用RPM包进行安装。RPM(RedHatPackageManager)是一种软件包管理系统,用于在RedHat系列的Linux发行版上进行软件安装、升级和卸载。本文将介绍如何选择适......
  • mysql arm dockerfile
    MySQLonARMwithDockerfileIntroductionWiththeincreasingpopularityofARM-baseddevices,itisbecomingmorecommontorunapplicationsandservicesonARMarchitecture.OnesuchapplicationisMySQL,apowerfulandwidelyusedrelationaldatabasem......
  • mysql redo_log_buffer_size
    MySQLredo_log_buffer_size详解在MySQL中,redolog是一种用于保证数据持久性的机制。当我们进行数据修改时,MySQL会将这些修改操作记录到redolog中,以便在系统崩溃或重启后,可以使用redolog来恢复数据的一致性。redolog的大小对于系统的性能和可靠性都有着重要的影响,本文将详细介......
  • mysql and 和 &&
    mysql和&&的区别在MySQL中,我们经常会使用AND和&&这两个操作符来组合多个条件。尽管它们都用于连接多个条件,但它们在使用时有一些区别。本文将介绍mysqland和&&的区别,并提供一些代码示例来帮助理解。AND操作符在MySQL中,AND是一个逻辑操作符,用于在WHERE子句中组......
  • mysql rank
    实现MySQLRank的流程实现MySQLRank的过程可以分为以下几个步骤:创建数据表导入数据编写查询语句添加Rank字段计算Rank值查询结果下面我会逐步介绍每个步骤需要做什么,并给出相应的代码说明。1.创建数据表首先,你需要创建一个包含需要排序的字段的数据表。假设......
  • mysql执行execute immediate
    实现"mysql执行executeimmediate"的步骤对于刚入行的小白来说,学会如何使用"mysql执行executeimmediate"可能会有些困惑。在本文中,我将向你展示整个实现过程的步骤,并提供每一步所需的代码和注释。步骤概述下面的表格演示了实现"mysql执行executeimmediate"的步骤概述。步......
  • mysql增加两列,并往里面添加数据
    MySQL增加两列,并往里面添加数据在MySQL数据库中,我们经常需要对表结构进行修改,例如添加新的列。本文将介绍如何使用SQL语句在MySQL中添加两列,并向这两列中添加数据。1.创建示例表首先,我们需要创建一个示例表,作为演示的基础。以下是一个简单的表结构:CREATETABLEstudents(i......
  • python 循环往两个占位符
    Python循环往两个占位符循环是编程中常用的一种控制结构,它允许我们重复执行一段代码,达到简化代码和提高效率的目的。Python是一种高级编程语言,提供了多种循环结构,其中包括通过占位符循环的方法。在本文中,我们将介绍如何使用Python中的循环来填充两个占位符。什么是占位符?在......