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;配置…

IPsec配置工具IP xfrm

IP命令支持IPSec配置&#xff0c;子命令为ip xfrm。命令内容如下&#xff1a; IP-XFRM(8) Linux IP-XFRM(8) NAME ip-xfrm - transform configurationSYNOPSIS ip [ OPTIONS ] xfrm { COMMAND | help }ip xfrm XFRM-OBJECT { COMMAND | help }XFRM-OBJECT : state | policy |…

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;双向环形链表。

2、Linux驱动开发:模块_引用符号

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…

linux部署es+kibana

部署kibana与es 3.4.1、拷贝文件 首先把elasticsearch-7.3.1-linux-x86_64.tar.gz 和kibana-7.3.1-linux-x86_64.tar.gz拷贝到linux上&#xff0c;比如我是拷贝/usr/local 目录下 3.4.2、解压文件 然后分别执行tar -zxvf elasticsearch-7.3.1-linux-x86_64.tar.gz和tar -zx…

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;网页篡改、计算机…

面试题 -- OC基础知识

文章目录 1. #import 跟#include 又什么区别&#xff0c;class呢, #import<> 跟 #import””又什么区别?2. 属性关键字assign、retain、weak、copy3. strong和weak关键字有什么区别4. 什么情况下使用weak关键字&#xff1f;相比于assign有什么不同&#xff1f;5. atomic…

【深度学习】【三维重建】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;小城市…

【每日随笔】人为制造稀缺 ( 粮食 | 买房 | 租房 | 钻石 | 教育 )

文章目录 一、人为制造的稀缺资源 - 粮食二、人为制造的稀缺资源 - 买房三、人为制造的稀缺资源 - 租房四、人为制造的稀缺资源 - 钻石五、人为制造的稀缺资源 - 教育 人为制造 稀缺资源 是 暴利 的挣钱方式 ; 本来不稀缺的资源 , 人人都有 , 人人都应该享有的资源 , 人为制造…

WPF实战学习笔记18-优化设计TodoView

文章目录 优化设计TodoView修复新增项目无法编辑问题增加了对完成状态的区分增加了选项卡删除功能更新删除请求URI添加删除命令并初始化UI添加删除按钮更改控制器 增加查询结果为空的图片增加转换器修改UI添加资源、命名空间 添加相关元素 增加了根据状态查询的功能Mytodo.Serv…

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 模块…

牛客小白月赛76 E.括号序列操作专家(贪心)

氧气少年有一个长度为 n的括号序列&#xff0c;括号序列只包含左括号 ( 和右括号 )。 一个括号序列是合法的&#xff0c;当且仅当此括号序列可以通过插入加号 和数字 1 得到一个正确的算术表达式。例如&#xff1a;括号序列 (())()&#xff0c;()&#xff0c;和 (()(())) 都是…

7月27日,每日信息差

1、万科与万达长春合作项目纠纷已基本达成和解&#xff0c;万达商管部分被冻结股权即将解冻 2、WPS AI海外版开启公测.由OpenAI和PaLM2提供大模型支持。目前&#xff0c;WPS AI在Windows和Android端的WPS Office的文字和PDF组件上可用。未来&#xff0c;它将嵌入到文字、演示文…

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 //可以删除密码也可以更…

Taskfile demo

https://github.com/yangyang5214/blog/issues/1 makefile 很好用&#xff0c;但是有些语法我不会。 go-task yml & shell 不错&#xff0c;推荐 Taskfile.yml https://github.com/go-task/task/blob/main/.golangci.yml # go install github.com/go-task/task/v3/cmd/ta…