Mysql存储-变量、函数、游标、判断、循环

2023-09-20 15:32:33

存储过程(procedure)

1、介绍:
存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。

存储过程思想上很简单,就是数据库SQL语言层面的代码封装与重用
2、特点
封装、复用
可以接收参数,也可以返回数据
减少网络交互,效率提升
3、基本语法
创建存储

CREATE PROCEDURE 存储过程名称([参数列表])
BEGIN
   -- SQL语句
END;

调用存储

call 存储过程名称

查看存储

-- 查看存储
-- 查看切换到指定库中指定存储创建具体信息
show create procedure  p1;
-- 查看库中所有存储
select * from information_schema.ROUTINES where ROUTINE_SCHEMA='test';

删除存储

DROP PROCEDURE [IF EXISTS] 存储过程名称;

案例

-- 创建存储
create procedure p4()
begin
    declare name_sto int;-- 定义变量
    select count(*) into name_sto from emp; -- 查询数据并且赋值给定义变量 into 变量名:数据来源复赋值变量
end;
-- 调用存储
call p4();
-- 查看存储
show create procedure  p4;
-- 删除存储
drop procedure p4;

变量

1、系统变量

介绍:
系统变量时MySQL服务器提供,不是用户定义的,属于服务器层面。
可分为:全局变量(GLOBAL)、会话变量(SESSION)。
全局变量在所有会话中有效,会话变量仅在当前会话中有效

查看系统变量:

-- 查看所有系统变量
SHOW [SESSION | GLOBAL] VARIABLES;

-- 可以通过like模糊匹配方式查找变量
SHOW [SESSION | GLOBAL] VARIABLES LIKE '...';

-- 查看指定变量的值
SELECT @@[SESSION. | GLOBAL.] 系统变量名;

设置系统变量:

SET [SESSION | GLOBAL] 系统变量名 =;
SET @@[SESSION. | GLOBAL.]系统变量名 =;

案例:

-- 变量:系统变量
-- 查看系统变量
show session variables;
show session variables like 'auto%';
show global variables like 'auto%';
select @@global.autocommit;

-- 设置系统变量
set session autocommit = 1;
set global autocommit = 1;
set @@global.autocommit = 1;

总结:mysql系统自带的变量可以通过系统变量的需求进行查看和设置

2、用户自定义变量

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

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 = 'itcast'; -- 自定义变量
set @int=14;
select @myname;-- 查看自定义变量
select @`int`;

局部变量

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

语法:

声明局部变量

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


局部变量赋值:

SET 变量名 = 值;
SET 变量名 := 值;
SELECT 字段名 INTO 变量名 FROM 表名 ...;

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

案例

create procedure p5()-- 创建存储
begin
    declare id int default 0;-- 声明局部变量
    set id=100;-- 变量赋值
    select count(*) into id from emp;-- 变量赋值
    select id;-- 查看变量或者调用局部变量返回给存储
end;

call p5;-- 调用存储过程

if

语法:

IF 条件1 THEN
  ...
ELSEIF 条件2 THEN    -- 可选
  ...
ELSE                -- 可选
  ...
END IF;

案例


create procedure  p6()
begin
    -- 声明局部变量
    declare score int default 60;-- 定义局部变量赋予默认值
    declare result varchar(100);-- 定义局部变量
    if score>80 then-- if编写
        set  result='优秀';
        elseif score>70 then
        set result='良好';
        else
        set  result='不合格';
    end if;
    select  result;-- 查看变量值返回存储
end;
call p6;-- 调用存储

参数(IN/OUT/INOUT)

参数:

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

CREATE PROCEDURE 存储过程名称([IN/OUT/INOUT 参数名 参数类型])
BEGIN
  -- SQL语句
END;

case:

语法1:

CASE case_value
     WHEN when_value1 THEN statement_list1
     [WHEN when_value2 THEN statement_list2]...
     [ELSE statement_list]
END CASE;

语法2:

CASE
     WHEN search_condition1 WHEN statement_list1
     [WHEN search_condition2 WHEN statement_list2]...
     [ELSE statement_list]
END CASE;

案例:

-- 创建存储过程
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;

-- 调用
call p6(8);

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

# 先判定条件,如果条件为true,则执行逻辑,否则,不执行逻辑
WHILE 条件 DO
   SQL逻辑...
END WHILE;

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

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

存储函数

存储函数是有返回值的存储过程,存储函数的参数只能是IN类型的。

语法:

CREATE FUNCTION 存储函数名称([参数列表])
RETURNS type [characteristics ...]
BEGIN
	-- SQL语句
	RETURN ...;
END;

characteristics的说明:

DETERMINISTIC:相同的输入参数总是产生相同的结果
NO SQL:不包含SQL语句
READS SQL DATA:包含读取数据的语句,但不包含写入数据的语句。

案例:

-- 存储函数
-- 从1到n的累加
create function fun1(n int) 
returns int deterministic --返回类型
begin
	declare total int default 0;
	
	while n > 0 do
		set total = total + n;
		set n = n - 1;
	end while;
	
	return total;
end;

-- 调用存储函数,并显示结果
select fun1(100);

更多推荐

小程序的数据驱动和Vue的双向绑定有何异同

引言在现代应用程序开发中,数据驱动和双向绑定是两个非常重要的概念。它们能够提供更好的用户体验和开发效率。本文将探讨小程序的数据驱动和Vue的双向绑定,并通过代码实例来说明它们的异同。让我们一起来了解吧!小程序的数据驱动小程序是一种轻量级的应用程序,可以在移动设备上运行。它采用了数据驱动的开发模式,将界面和数据分离。这种

InsCode Stable Diffusion 美图活动一期——即刻体验!来自 CSDN 的 SD 模型

文章目录🔥关于活动📋前言🎯什么是StableDiffusion🧩StableDiffusion与其他AI艺术生成器有什么区别?🎯开始体验InsCodeStableDiffusion🎯试用SD模型生成优质人物好图🧩第一款(测试)🧩第二款🧩第三款🧩第四款(优化第一款)🎯StableDiffusion常

Redis 事务 - 监控测试

Redis基本事务操作Redis事务本质:一组命令的集合!一个事务中的所有命令都会被序列化,在事务执行过程的中,会按照顺序执行!Redis事务是一组Redis命令的有序集合,这些命令在事务中按照顺序执行,但在事务执行过程中不会立即执行,而是将它们放入一个队列中,等待显式提交(EXEC命令)后才会执行。例如:(按顺序执行

Altera&Xilinx公司FPGA简介

Intel/Altera公司Intel/Altera系列FPGA简介-知乎(zhihu.com)AlteraFPGA提供了多种可配置嵌入式SRAM、高速收发器、高速I/O、逻辑模块以及布线。其内置知识产权(IP)结合优秀的软件工具,缩短了FPGA开发时间,降低了功耗和成本。AlteraFPGA非常适合从大批量应用到目前

Windows驱动开发(一)第一个驱动程序

首先我们需要了解,在操作系统中,是分两种权限的,一种是内核态,我们也称为0环,一种是用户态,称之为3环。而在我们的电脑中,驱动程序是运行在内核态的,这意味着和操作系统内核是在同一权限的,而普通的应用程序的权限是最低的。高权限谁不想拥有呢,因此驱动程序是很有必要了解与学习的。比如我们熟知的防病毒软件,游戏保护等,现在都在

线性代数的本质(九)——二次型与合同

文章目录二次型与合同二次型与标准型二次型的分类度量矩阵与合同二次型与合同二次型与标准型Grant:二次型研究的是二次曲面在不同基下的坐标变换由解析几何的知识,我们了解到二次函数的一次项和常数项只是对函数图像进行平移,并不会改变图形的形状和大小。以一元二次函数为例而二次函数的二次项控制函数图像的大小和形状。以二元二次函数

性能测试之使用Jemeter对HTTP接口压测

我们不应该仅仅局限于某一种工具,性能测试能使用的工具非常多,选择适合的就是最好的。笔者已经使用Loadrunner进行多年的项目性能测试实战经验,也算略有小成,任何性能测试(如压力测试、负载测试、疲劳强度测试等)都可以使用该工具。但我并不鼓励这样做,我们应该根据当前所处的情况,基于被测对象、时间及成本考虑,采用最合适的

卓越领先!安全狗入选2023年福建省互联网综合实力50强

近日,福建省互联网协会在2023年东南科技论坛——智能算力助力数字经济产业融合发展论坛上正式发布2023年福建省互联网综合实力前50家企业最终评定结果。作为国内云原生安全领导厂商,安全狗凭借突出的竞争力和市场表现入选综合实力50强。厦门服云信息科技有限公司(品牌名:安全狗)成立于2013年,致力于提供云安全、(云)数据

第一章:最新版零基础学习 PYTHON 教程(第六节 - Python 中的命名空间和作用域)

什么是命名空间:命名空间是一个为Python中的每个对象都有唯一名称的系统。对象可能是变量或方法。Python本身以Python字典的形式维护一个命名空间。让我们看一个例子,计算机中的目录文件系统结构。不用说,可以有多个目录,每个目录中都有一个同名的文件。但是,只要指定文件的绝对路径,就可以根据需要定向到该文件。实时的

利用免费的敏捷研发管理工具管理端到端敏捷研发流程

Leangoo领歌是Scrum中文网(scrum.cn)旗下的一款永久免费的敏捷研发管理工具。Leangoo领歌覆盖了敏捷研发全流程,它提供端到端敏捷研发管理解决方案,包括小型团队敏捷开发,规模化敏捷SAFe,ScrumofScrums大规模敏捷,涵盖敏捷需求管理、任务协同、进展跟踪、缺陷管理、统计度量等。提供了不同视

【Rust 基础篇】Rust 声明宏:代码生成的魔法

导言Rust是一门以安全性和性能著称的系统级编程语言,它提供了强大的宏系统,使得开发者可以在编译期间生成代码,实现元编程(Metaprogramming)。宏是Rust中的一种特殊函数,它可以接受代码片段作为输入,并根据需要生成代码片段作为输出。本篇博客将深入探讨Rust中的声明宏,包括声明宏的定义、声明宏的特点、声明

热文推荐