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

目录

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()
BEGINDECLARE var INT DEFAULT 20;IF var > 40THEN SELECT '中年';ELSEIF var > 18THEN SELECT '青年';ELSEIF var > 8THEN SELECT '少年';ELSE SELECT '幼年';END IF;
END $DELIMITER ;

   •   case使用

#CASE的使用
DELIMITER $CREATE PROCEDURE test()
BEGINDECLARE var INT DEFAULT 20;CASE varWHEN 40 THEN SELECT '中年';WHEN 20 THEN SELECT '青年';WHEN 10 THEN SELECT '少年';ELSE SELECT '幼年';END CASE;
END $DELIMITER ;

7.循环结构

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

    •   loop

#loop的使用
DELIMITER $CREATE PROCEDURE test()
BEGINDECLARE var INT DEFAULT 20;loop_label:LOOPSET var = var + 1;IF var >= 10 THEN LEAVE loop_label;END IF;END LOOP loop_label;END $DELIMITER ;

   •   while

#while的使用
DELIMITER $CREATE PROCEDURE test()
BEGINDECLARE var INT DEFAULT 20;WHILE var <= 10 DOSET num = num + 1;END WHILE;END $DELIMITER ;

   •   repeat相当于-do…while…

#repeat的使用
DELIMITER $CREATE PROCEDURE test()
BEGINDECLARE var INT DEFAULT 20;REPEATSET var = var + 1;UNTIL var >= 10END 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)
BEGINDECLARE 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_salaryEND REPEAT;SET total_count = count_re;#关闭游标CLOSE emp_cursor;
END //DELIMITER ;

为什么要关闭游标:

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

3.游标的优缺点   

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

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

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

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

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

相关文章

微信小程序客服系统-对接消息推送-对接模板订阅消息-嵌入webview客服链接

想要给自己的小程序增加客服系统功能 小程序客服对接导自己的系统等需求&#xff0c;可以参照我开发的客服系统&#xff0c;实现私有化部署搭建对接的微信小程序 小程序消息推送对接 首先登录小程序后台在小程序后台>开发管理>开发设置>服务器域名部分&#xff0c;配置…

Sentinel限流中间件

目录 介绍 Sentinel 的特征 Sentinel 的组成 实战使用 简单实例 配置本地控制台 使用可视化ui配置简单流控 配置异步任务限流 使用注解定义限流资源 SpringCloud整合Sentinel 简单整合 并发线程流控 关联模式 整合openFeign使用 介绍 随着微服务的流行&#xff0…

Ansible自动化运维工具

Ansible自动化运维工具 一、ansible介绍二、ansible环境安装部署三、ansible命令行模块1、command模块2、shell模块3、cron模块4、user模块5、group模块6、copy模块7、file模块8、hostname模块9、ping模块10、yum模块11、service/systemd模块12、script模块13、mount模块14、ar…

list源码分析,基于c++ 和vs2019,cpp20标准

list源码分析,基于c 和vs2019&#xff0c;cpp20标准。结构确实如图&#xff0c;双向环形链表。

python读取json文件

import json# 文件路径(同目录文件名即可,不同目录需要绝对路径) path 1.json# 读取JSON文件 with open(path, r, encodingutf-8) as file:data json.load(file)#data为字典 print(data) print(type(data))

网络安全工程师证书有什么用?什么是网络安全工程师?你想知道的都在这里

随着互联网的发展和大数据时代的到来&#xff0c;网络已经日渐深入到我们生活、工作中的方方面面&#xff0c;社会信息化和信息网络化&#xff0c;突破了应用信息在时间和空间上的障碍&#xff0c;使信息的价值不断提高。但是&#xff0c;与此同时&#xff0c;网页篡改、计算机…

【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程

【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程 文章目录 【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程前言确定版本对应关系源码编译安装tiny-cuda-nn总结 前言 本人windows11下使用【Instant Neural Surface Reconstruction】算法时需要…

小城市当程序员好不好?

在职业发展中&#xff0c;小城市和大城市都有各自的机会和挑战。在大城市&#xff0c;C#的应用比例可能相对较低&#xff0c;学习C可能有一定的难度&#xff0c;而学习Java最好有人指导。在小城市&#xff0c;机会相对较少&#xff0c;跳槽的选择也有限。然而&#xff0c;小城市…

Ansible 自动化运维工具

目录 一、概述 1.ansible 简介 2.ansible 特性 3.ansible 架构 二、ansible 环境安装部署 1.管理端安装 ansible&#xff08;192.168.88.10&#xff09; 2. ansible 工作目录 3. 配置主机清单 4.配置密钥对验证 三、ansible 命令行模块 1.command 模块 2.shell 模块…

Git基本操作

Git使用 1.命令行操作 1.1 本地库操作 1.1.1 本地库初始化 命令&#xff1a; git init 效果&#xff1a; 注意&#xff1a;.git目录中存放的是本地库相关的子目录和文件&#xff0c;不能删除和修改。 1.1.2 设置签名 作用&#xff1a;区分不同的开发人员身份 格式&…

思科路由器交换机密码破解教程

1. 路由器密码的恢复. 2600、3600等新系列路由器步骤&#xff1a; 1、启动路由器&#xff0c;60秒内按下ctrlbreak键2、rommon>confreg 0x21423、rommon>reset4、router#copy startup-config running-config5、router(config)#no enable secrect //可以删除密码也可以更…

1 js嵌入html使用

1.1 直接在html内部使用js代码 使用script标签&#xff0c;在前后标签内部写的代码即为js代码。 <body><p id"p1">初始段落</p> <!--id是为了定位需要更改内容的标签--><button type"button" onclick"showNum()">…

Tesseract开源的OCR工具及python pytesseract安装使用

一 、介绍 Tesseract是一款由Google赞助的开源OCR。 pytesseract是python包装器&#xff0c;它为可执行文件提供了pythonic API。 Tesseract 已经有 30 年历史&#xff0c;开始它是惠普实验室的一款专利软件&#xff0c;在2005年后由Google接手并进一步开发和完善。Tesseract支…

YOLOv7 论文学习

1. 解决了什么问题&#xff1f; 实时的目标检测器是计算机视觉系统的重要组成部分。目前应用在 CPU 端的实时目标检测方法大多基于 MobileNet、ShuffleNet、GhostNet&#xff0c;而用在 GPU 的实时目标检测方法大多基于 ResNet、DarkNet、DLA&#xff0c;然后使用 CSPNet 策略…

MLP-Mixer:面向视觉的全mlp架构

文章目录 MLP-Mixer: An all-MLP Architecture for Vision摘要本文方法代码实验结果 MLP-Mixer: An all-MLP Architecture for Vision 摘要 卷积神经网络(cnn)是计算机视觉的首选模型。 最近&#xff0c;基于注意力的网络&#xff0c;如VIT&#xff0c;也变得流行起来。在本文…

消息中间件ActiveMQ介绍

一、消息中间件的介绍 介绍 ​ 消息队列 是指利用 高效可靠 的 消息传递机制 进行与平台无关的 数据交流&#xff0c;并基于 数据通信 来进行分布式系统的集成。 特点(作用) 应用解耦 异步通信 流量削峰 (海量)日志处理 消息通讯 …... 应用场景 根据消息队列的特点&a…

【蓝图】p40-p43对象引用、变量有效性、实现键盘控制物体自转、简单点名系统

p40-p43对象引用、变量有效性、实现键盘控制物体自转、简单点名系统 p40对象引用、变量有效性p41实现键盘控制物体自转创建bool值控制旋转实现通过键盘控制自转 p42p43简单点名系统Get All Actors Of Class&#xff08;获得场景中所有该类的actor演员&#xff09;getFor Each L…

蓝桥杯专题-真题版含答案-【贪吃蛇长度】【油漆面积】【绘制圆】【高次方数的尾数】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

(一)RabbitMQ概念-优势、劣势、应用场景 、AMQP、工作原理

Lison <dreamlison163.com>, v1.0.0, 2023.06.22 RabbitMQ概念-优势、劣势、应用场景 、AMQP、工作原理 文章目录 RabbitMQ概念-优势、劣势、应用场景 、AMQP、工作原理RabbitMQ概念RabbitMQ的优势RabbitMQ劣势RabbitMQ应用的场景RabbitMQ_AMQPRabbitMQ工作原理 RabbitM…

Flutter、Android Studio 安装详细步骤以及常错解决

目录 一、前言 二、介绍 三、安装 (一&#xff09;、安装Flutter SDK 1&#xff09;双击文件夹&#xff0c;打开之后就是这样&#xff1a;​编辑 2&#xff09;双击此文件&#xff1a;​编辑 3&#xff09;此过程问题&#xff1a; (二&#xff09;、配置 Flutter SDK 环…