MySQL的变量、流程控制与游标

news2024/11/15 14:00:02

目录

1.变量的分类

1.系统变量的分类

1.1.二者关系

2.查看系统变量

3.修改系统变量的值

4.用户变量

4.1会话用户变量

1.变量声明与赋值

2.变量使用   

4.2.局部变量

1.使用declare 声明  

2.局部变量声明格式   

3.局部变量赋值   

4.变量使用   

5.定义条件与处理程序

1.定义条件:

2.定义条件格式:

3.处理程序:

6.流程控制之分支结构

7.循环结构

8.跳转语句

9.游标

1.游标的作用

2.使用游标的步骤

3.游标的优缺点   


1.变量的分类

变量分为:系统变量、用户变量

1.系统变量的分类

        全局系统变量

        会话系统变量

1.1.二者关系

    •   全局系统变量针对于所有会话有效,但不能 跨重启

    •   会话系统变量针对当前会话有效,修改某个会话系统变量不会影响其他会话系统变量

    •   修改全局系统变量也会修改其他会话的全局系统变量值

    •   有些系统变量只能是全局系统变量,有些能当全局也能当会话系统变量,有些只能是会话系统变量

2.查看系统变量

    •   show global variables

    •   show session variables

    •   show variables - 默认查询会话系统变量

    •   select @@global.变量名/查看指定系统变量

    •   select @@session.变量名

    •   select @@变量名 先查看会话,没有就查看全局系统变量

#查看全局系统变量
SHOW GLOBAL VARIABLES;

#查看会话系统变量
SHOW SESSION VARIABLES;

#查询指定会话系统变量
SELECT @@global.max_connections;

#查询指定全局系统变量
SELECT @@global.character_set_client;

查询结果: 

 全局系统变量:

会话系统变量:

 

3.修改系统变量的值

    •   set @@global.变量名

    •   set global 全局变量名

SET @@global.max_connections = 161;
SET GLOBAL max_connections = 171;

    •   针对于当前的数据库实例有效,一旦重启mysql服务,就失效了

    •   set @@session.变量名

    •   set session 变量名

SET @@session.admin_port = 161;
SET SESSION admin_port = 171;

    •   针对于当前会话有效,一旦结束会话,重新建立起新的会话,就失效

4.用户变量

    •   分为会话用户变量(@修饰)、局部变量

    •   会话用户变量:使用@开头,只对当前连接会话有效

    •   局部变量:只在begin和end语句有效,只能在存储过程和函数使用

4.1会话用户变量

1.变量声明与赋值

            •   set @用户变量 := 值

            •   select @用户变量 := 语句 from

            •   select 语句 into @用户变量 from 表名

#设置会话用户变量
SET @m1 := 1;

SELECT @count := COUNT(*) FROM employees;

SELECT AVG(salary) INTO @salary FROM employees; 

2.变量使用   

            •   select @变量名

#变量的使用
SET @sum := @m1 + @count;

SELECT @sum;

4.2.局部变量

1.使用declare 声明  

    •   必须声明并使用在begin…end中

    •   必须使用在存储过程/函数中

    •   declare的方式声明的局部变量必须声明在begin中的首行的位置

    •   必须变量指明类型

2.局部变量声明格式   

    •   declare 变量名 类型

3.局部变量赋值   

    •   set 变量 := 值

    •   select 语句 into 变量 from 表名

4.变量使用   

    •   select 变量名

以上所有的代码示例:

DELIMITER $

CREATE PROCEDURE test()
BEGIN
	#局部变量声明
	DECLARE a INT DEFAULT 0;
	DECLARE emp_name VARCHAR(20);

	#局部变量赋值
	SET a := 1;
	SELECT last_name INTO emp_name FROM employees WHERE emp_id = 111;

	#局部变量使用
	SELECT a,emp_name;
END $

DELIMITER ;

#调用存储过程
CALL test();

5.定义条件与处理程序

1.定义条件:

        给mysql中的错误码命名,有助于存储的程序代码更清晰

        将一个错误名字和指定的错误条件关联起来 

2.定义条件格式:

        declare 错误名称 condition for 错误码 

错误码:举例:

                ERROR 1148(42000);

                1418-mysql_error_code;

                HY000-sqlstate_value

#定义 “ERROR 1148(42000)”错误,名称为command_not_allowed
#定义方式1:使用MySQL_error_code
DECLARE command_not_allowed CONDITION FOR 1148;

#定义方式2:使用sqlstate_value
DECLARE command_not_allowed CONDITION FOR SQLSTATE '42000';

3.处理程序:

        遇到问题时应当采取的处理方式,并且保证存储过程/函数在遇到错误时能够继续执行   

    •   declare 处理方式 handler for 错误类型 处理语句

    •   处理方式:continue、exit、undo(不支持)

#定义处理程序
#方式1:捕获sqlstate_value
DECLARE CONTINUE HANDLER FOR SQLSTATE '42000' SET @info = 'NO_SUCH_TABLE';

#方式2:捕获MySQL_error_code
DECLARE CONTINUE HANDLER FOR 1148 SET @info = 'NO_SUCH_TABLE';

#方式3
DECLARE EXIT HANDLER FOR SQLWARNING SET @info = 'ERROR';

6.流程控制之分支结构

   •   if使用

#IF的使用
DELIMITER $

CREATE PROCEDURE test()
BEGIN
	DECLARE var INT DEFAULT 20;
	
	IF var > 40
		THEN SELECT '中年';
	ELSEIF var > 18
		THEN SELECT '青年';
	ELSEIF var > 8
		THEN SELECT '少年';
	ELSE 
		SELECT '幼年';
	END IF;
END $

DELIMITER ;

   •   case使用

#CASE的使用
DELIMITER $

CREATE PROCEDURE test()
BEGIN
	DECLARE var INT DEFAULT 20;
	
	CASE var
		WHEN 40 THEN SELECT '中年';
		WHEN 20 THEN SELECT '青年';
		WHEN 10 THEN SELECT '少年';
		ELSE SELECT '幼年';
	END CASE;
END $

DELIMITER ;

7.循环结构

    •   循环结构四要素:初始化条件、循环条件、循环体、迭代条件

    •   loop

#loop的使用
DELIMITER $

CREATE PROCEDURE test()
BEGIN
	DECLARE var INT DEFAULT 20;
	loop_label:LOOP
		SET var = var + 1;
		IF var >= 10 THEN LEAVE loop_label;
		END IF;
	END LOOP loop_label;

END $

DELIMITER ;

   •   while

#while的使用
DELIMITER $

CREATE PROCEDURE test()
BEGIN
	DECLARE var INT DEFAULT 20;
	WHILE var <= 10 DO
		SET num = num + 1;
	END WHILE;

END $

DELIMITER ;

   •   repeat相当于-do…while…

#repeat的使用
DELIMITER $

CREATE PROCEDURE test()
BEGIN
	DECLARE var INT DEFAULT 20;
	REPEAT
		SET var = var + 1;
		UNTIL var >= 10
	END REPEAT;
END $

DELIMITER ;

8.跳转语句

    •   leave-相当于break

    •   iterate-相当于continue;只能在循环结构中使用

#跳转语句之leave
DELIMITER $

CREATE PROCEDURE leave_begin(IN num INT)
begin_label: BEGIN
IF num<=0
THEN LEAVE begin_label;
ELSEIF num=1
THEN SELECT AVG(salary) FROM employees;
ELSEIF num=2
THEN SELECT MIN(salary) FROM employees;
ELSE
SELECT MAX(salary) FROM employees;
END IF;
SELECT COUNT(*) FROM employees;
END $

DELIMITER ;

 

9.游标

1.游标的作用

    •   游标让SQL这种面向集合的语言有了面向过程开发的能力

    •   游标充当了指针的作用,是一种临时的数据库对象

2.使用游标的步骤

    1.  定义游标:declare…cursor for…;(在oracle中使用cursor is)

    2.  打开游标:open cursor_name

    3.  使用游标(从游标中取得数据):fetch into

    4.  关闭游标:close …

#游标的使用
DELIMITER //

CREATE PROCEDURE get_count_by_limit_total_salary(IN limit_total_salary DOUBLE,
OUT total_count INT)
BEGIN
	DECLARE emp_sal DOUBLE DEFAULT 0.0;
	DECLARE sum_sal DOUBLE DEFAULT 0.0;
	DECLARE count_re INT DEFAULT 0;
	
	
	#定义游标
	DECLARE emp_cursor CURSOR FOR SELECT salary FROM employees ORDER BY salary DESC;
	#打开游标
	OPEN emp_cursor;
	
	REPEAT
		#使用游标
		FETCH emp_cursor INTO emp_sal;
		SET sum_sal = sum_sal + emp_sal;
		SET count_re = count_re + 1;
		UNTIL sum_sal >= limit_total_salary
	END REPEAT;
	
	SET total_count = count_re;
	
	#关闭游标
	CLOSE emp_cursor;
END //

DELIMITER ;

为什么要关闭游标:

        因为游标会占用系统资源,不及时关闭,游标会一直保持到存储过程结束,影响系统运行的效率

3.游标的优缺点   

     •   优点:为逐条读取结果集中的数据提供了完美的解决方案。

    •   缺点:使用游标时会对数据行进行加锁,在业务并发量大时,会影响业务效率、消耗系统资源、造成内存不足;因为游标是在内存中进行的处理

    •   建议:用完游标及时关闭,提高效率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/798725.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Datawhale夏令营】任务二学习笔记

目录 一&#xff1a;python语法回顾 1.1 print() 1.2 列表与字典 1.3自定义函数与return 1.4火车类&#xff08;面向对象&#xff09; 实例化总结&#xff1a; 二&#xff1a;LightGBM 代码精读 2.1导入库 2.2数据准备与参数设置 2.3时间特征函数 2.4优化 2.5训练与…

Verilog | Round_Robin_Arbiter

重写了权重轮询仲裁&#xff0c;添加lock输入信号&#xff0c;表示请求方收到了仲裁许可&#xff0c;在对应的lock拉低之前&#xff0c;仲裁器不可以开启新的仲裁。 Generics Generic nameTypeValueDescriptionN4 Ports Port nameDirectionTypeDescriptionclkinputrst_ninp…

MSP432自主开发笔记4:DS3115舵机的0~180全角度驱动

芯片使用&#xff1a;MSP432P401R. 今日学习一款全角度15KG大扭力舵机的驱动&#xff0c;最近电赛学习任务紧&#xff0c;更新一篇比较水的文章&#xff1a; 文章提供原理解释&#xff0c;全部代码&#xff0c;整体工程&#xff1a; 目录 舵机驱动原理: 这是舵机DS3115MG:…

Python怎么实现贪婪排名算法

目录 什么是贪婪排名算法 贪婪排名算法的优点 贪婪排名算法的应用 Python怎么实现贪婪排名算法 总结 什么是贪婪排名算法 贪婪排名算法是一种常见的排序算法&#xff0c;在许多优化问题中得到广泛应用。它的主要思想是通过每次选择当前看起来最优的选择&#xff0c;逐步构…

嵌入式:QT Day3

一、完成闹钟的实现 首页&#xff1a; 启动后&#xff1a; 点击停止后&#xff1a; 二、思维导图

Ansible的应用

Ansible简介 Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。 Ansible能批量配置、部署、管理上千台主机…

4. 方法(函数)

文章目录 4.1. 什么是方法的返回值?返回值在类的方法里的作用是什么?4.2. 为什么 Java 中只有值传递&#xff1f; 4.1. 什么是方法的返回值?返回值在类的方法里的作用是什么? 方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果&#xff01;&#xff08;前提…

MessageBox弹出框中加入DatePicker日期选择器

效果&#xff1a; 代码片段 重点是open函数中&#xff0c;使用了h函数来写dom。关于h函数的解释可见一下博文点击跳转博文&#xff1a;解析h函数 在element-ui的官方文档中&#xff0c;对这种方式有清晰的解释。点击跳转官网可见 <template><div><el-button t…

appium介绍

移动自动化测试工具appium。appium目前在移动UI自动化测试领域占有重要地位&#xff0c;不仅支持Android和IOS两大平台&#xff0c;还支持多种编程&#xff0c;因而得到广泛的应用。 移动应用类型 移动应用类型主要分为以下几类 Native App&#xff1a;原生应用。Mobile Web…

Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁)

先来了解下一个空白app的进程中线程数量&#xff1a; 分析迷你世界中app线程之前&#xff0c;先来了解下空白app &#xff0c;中线程情况&#xff1a; 一个空白app的线程大概是27个&#xff1a; 一个空白的的app&#xff0c;包含FinalizerDaemon线程、FinalizerWatchd线程、R…

GitHub Copilot:让开发编程变得像说话一样简单

引用&#xff1a; 人类天生就梦想、创造、创新。但今天&#xff0c;我们花太多时间被繁重的工作所消耗&#xff0c;花在消耗我们时间、创造力和精力的任务上。为了重新连接我们工作的灵魂&#xff0c;我们不仅需要一种更好的方式来做同样的事情&#xff0c;更需要一种全新的工…

“从世界第一黑客到顶级安全咨询专家” 凯文·米特尼克去世

一、人物简介 凯文米特尼克&#xff08;英语&#xff1a;Kevin David Mitnick&#xff0c;1963年8月6日—2023年7月16日&#xff09;&#xff0c;是美国计算机安全顾问&#xff0c;作家和黑客。他拥有“世界头号黑客”&#xff0c;“世界上最著名的黑客”、“地狱黑客”、“头号…

SPI通信

文章目录 SPI通信简介硬件电路移位示意图SPI时序基本单元1.起始条件2.终止条件模式1模式0模式2模式3 SPI时序 SPI通信简介 四根通信线&#xff1a; SCK"串行时钟线 MOSI:主机输出从机输入 MISO:主机输入从机输出 SS:从机选择 通信方式&#xff1a;同步&#xff0c;全双工…

向量数据库Milvus的四个版本

目录 MilvusLite版 单机版 分布式版 Milvus Cloud版 Milvus是一个功能强大的向量数据库管理系统,提供了多种版本,以满足不同用户的需求。以下是关于Milvus四个版本的具体介绍。 MilvusLite版 MilvusLite版是Milvus的轻量级版本,适合于小规模数据集和高性能计算场景。…

使用for循环输出左上三角、右上三角、左下三角、右下三角、上下三角

1、输出如下图形&#xff1a; #include<stdio.h> int main() {/*输出图形 666666666666666*/for(int i1;i<5;i){for(int j1;j<i;j){putchar(6);}printf("\n"); } return 0; } 2、输出如下图形&#xff1a; #include<stdio.h> int main() {/*输出图…

合作客户销售数据可视化分析

以一个案例进行实际分析&#xff1a; 数据来源&#xff1a;【地区数据分析】 以此数据来制作报表。 技巧一&#xff1a;词云图 以城市名称来显示合同金额的分布&#xff0c;合同金额越大&#xff0c;则城市文字显示越大。 2 2 2 2 2 2

【MySQL数据库备份】

目录 一、概述 二、数据备份的重要性 1. 数据保护 2. 灾难恢复 3. 数据完整性 4. 合规性要求 三、造成数据丢失的原因 1. 硬件故障 2. 人为错误 3. 黑客攻击 4. 自然灾害 5. 软件故障 四、备份类型 1.物理与逻辑角度 1.1 概念 1.2 物理备份 1.2.1 冷备份 1.2…

php-golang-jsonrpc2.0 rpc-codec/jsonrpc2和tivoka/tivoka实践

golang代码&#xff1a; package main import ( "context" "net" "net/rpc" "github.com/powerman/rpc-codec/jsonrpc2" ) type App struct{} type Res struct { Code int json:"code" Msg string json:"msg&quo…

kafka集群

目录 broker ZooKeeper consumer group&#xff08;消费者组&#xff09; 分区&#xff08;Partitions&#xff09; 副本&#xff08;Replicas&#xff09; 主题&#xff08;Topic&#xff09; 偏移量&#xff08;offset&#xff09; broker 一个kafka进程就是一个broker…

C++ 名字空间namespace

在C中支持三种域&#xff1a;局部域、名字空间域和类域。 名字空间域是随标准C而引入的。它相当于一个更加灵活的文件域&#xff08;全局域&#xff09;&#xff0c;可以用花括号把文件的一部分括起来&#xff0c;并以关键字namespace开头给它起一个名字&#xff1a; namespac…