返回顶部
首页 > 资讯 > 数据库 >MySQL变量、流程控制和游标
  • 915
分享到

MySQL变量、流程控制和游标

MySQL变量流程控制和游标 2016-07-31 13:07:07 915人浏览 才女
摘要

变量、流程控制和游标 变量 在Mysql数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终的结果的数据 系统变量 变量由系统定义,属于服务器层面 系统变量的分类 每一个mysql客户机成功连接服务器后,都

MySQL变量、流程控制和游标

变量、流程控制和游标

变量

Mysql数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终的结果的数据

系统变量

变量由系统定义,属于服务器层面

系统变量的分类

每一个mysql客户机成功连接服务器后,都会产生与之对应的会话(建立一次连接相当于一次会话)。Mysql服务实例会在服务器内存中生成与该会话对应的系统变量,他们的初值都是全局系统变量值的复制

  • 全局变量(global)

修改针对所有的会话有效,但不能跨重启(重启后修改值全面恢复默认值)

  • 会话变量(session)

修改针对当前的会话有效,不会影响其他同一会话系统变量的值

如果不写关键字,则默认会话级别

有些系统变量只是全局,有些只是会话,有些既是全局又是会话

查看系统变量

  • 查看所有或部分系统变量
#所有

#查看所有全局变量
SHOW GLOBAL VARIABLES;
#查看所有会话变量
SHOW SESSION VARIABLES;
或是
SHOW VARIABLES;

查询效果:

#部分

#查看部分会话变量
SHOW GLOBAL VARIABLES LIKE "模糊查询";
#查看部分会话变量
SHOW SESSION VARIABLES LIKE "模糊查询";
  • 查看指定系统变量

MySQL中是以两个@开始;@@global是全局,@@session是会话 既全局又会话。@@符首先标记会话变量,要是没有会话变量,则标记系统变量

#查看指定的系统变量
SELECT @@global.变量名;
#查看指定会话变量
SELECT @@session.变量名;
或是
SELECT @@变量名;

修改系统变量

有时要修改系统变量的值,以便修改当前会话或是MySQL服务实例的属性、特征

具体方法

  • 方法一:修改配置文件,修改后要重启服务(服务器如果已经运行,则毫无意义)

  • 方法二:在运行期间,使用 SET 指令
#为某个系统变量赋值:

#全局系统变量:针对当前数据库实例是有效的,一旦重启服务器,就失效了
#方式一:
SET @@global.变量名 = 要赋的值;
#方式二:
SET GLOBAL 变量名 = 要赋的值;

#会话系统变量:针对当前会话是有效的,一旦建立起新的会话,就失效了
#方式一:
SET @@session.变量名 = 要赋的值;
#方式二:
SET SESSION 变量名 = 要赋的值;

用户变量

用户变量的分类

用户变量是用户自定义。在MySQL以一个"@"开头(主要修饰会话用户变量)

  • 会话用户变量:作用域和会话变量一样,只对当前来连接会话有效

  • 局部变量:只在BEGIN和END中有效,在存储过程和函数中使用

会话用户变量

  • 变量的定义与赋值
#方式一::=或=
SET @变量名 := 值;
SET @变量名 = 值;

#方式二::=或INTO
SELECT @变量名 := 表达式[FROM 等句];
SELECT 表达式 INTO @变量名 [FROM 等句];
  • 使用
SELECT @变量名;

局部变量

定义:使用 DECLARE 去定义一个局部变量

作用域:在它的 BEGIN...END 中有效

位置:能放在 BEGIN...END 中,且在第一句

  • 变量定义
DECLARE 变量名 类型 [default 值]#如果没有默认值,则初始值null
  • 赋值
SET 变量名 = 值;
SET 变量名 := 值;

SELECT 变量名 := 表达式[FROM 等句];
SELECT 表达式 INTO 变量名 [FROM 等句];

  • 使用
SELECT 局部变量名;

举个例子:

delimiter $
create procedure test_var()
begin 
      declare a int default 0;
      declare b int default 0;
	  #declare a,b int default 0;
      declare emp_name varchar(15);
      
      set a = 1,b := 2; 
      select name into emp_name from emp1 where id = 3;
      select a,b,emp_name;
end $
delimiter ;
call test_var();

对比会话用户与局部变量

定义条件与处理程序(异常处理)

定义条件:事先定义程序执行过程中可能遇到的问题

处理程序:定义了在遇到问题时应当采取的处理方式,并且保证存储过程或函数的继续执行

注:定义条件和处理程序在存储函数中都是支持的

定义条件

定义条件就是给错误代码命名,将一个错误名字一个指定错误条件关联起来。这个名字可以随后被用在定义处理程序的DECLARE HANDLER语句中

语法格式:

DECLARE 错误名字 CONDITION FOR 错误码或错误条件(数值类型的错误码);
或是
DECLARE 错误名字 CONDITION FOR sqlstate "(字符串类型的错误代码)";

错误码说明:

  • MySQL_error_code和sqlstate_value都可以表示MySQL的错误

MySQL_error_code:数值类型错误代码

sqlstate_value:长度为s的字符串类型的错误代码

举个例子

DECLARE Field_Not_Be_NULL CONDITION FOR 1048;
        #错误名字                       错误码

定义处理程序

可以为MySQL执行过程中发生的某种类型的错误定义特殊的处理程序。(在一开头就编写)

语法格式:

DECLARE 处理方式 HANDLER FOR 错误类型 处理语句;
  • 处理方式:

CONTINUE:遇到错误不处理,继续执行

EXIT:遇到错误马上退出

UNDD:遇到错误后撤回之前的操作,MySQL暂时不支持这样的操作

  • 错误类型(条件):

SQLSTATE"字符串错误码":长度是s的字符串类型错误码

MySQL_error_code:数值类型错误码

错误名称:定义条件起的名字

SQLWARNING:匹配01开头的SQLSTATE错误码

NOT FOUND:匹配02开头的SQLSTATE错误码

SQLEXCEPTION:匹配既不是SQLWARNING,也不是NOT FOUND的SQLSTATE类型错误码

  • 处理语句

简单句:SET 变量 = 值;

复杂句:BEGING ... END;

举个例子

DECLARE CONTINUE HANDLER FOR 1048 SET @error = -1;
      #处理方式:继续         错误码    让error = 1

流程控制

类比其他语言的流程控制(我这里会写的简单一点),在执行语句时记得加上WHERE来限制

控制存储过程中SQL语句的执行顺序。

只要是程序,流程就分为三大类

  • 顺序结构:从上到下执行
  • 分支结构:按给出的条件执行,二选一或是多选一
  • 循环结构:在一定条件下,执行一组语句

针对于MySQL,的流程控制主要有三类(只用于存储程序

  • 条件判断语句:IF语句和CASE语句
  • 循环语句:LOOP、WHILE、REPEAT语句
  • 跳转语句:ITERATE、LEAVE语句

分支结构1(IF)

语句中可以没有else

语法格式;

IF 表达式1 THEN 操作1
ELSEIF 表达式2 THEN 操作2
...
ELSE 操作N
END IF;

分支结构2(CASE)

语法格式:

#情况一:
CASE 表达式
WHEN 值1 THEN 操作1;
WHEN 值2 THEN 操作2;
...
ELSE 操作N;
END[case];#BEGIN END 中要加case

#情况二:
CASE 
WHEN 条件1 THEN 操作1;
WHEN 条件2 THEN 操作2;
...
ELSE 操作N;
END[case];#BEGIN END 中要加case

循环结构1(LOOP)

循环语句有四个条件:

  • 初始条件
  • 循环条件
  • 循环体
  • 迭代条件

LOOP内语句一直重复执行,知道循环退出(使用LEAVE子句)

语法格式:

[loop_label:] LOOP
    循环体;
END LOOP [loop_label];

举个例子:

#从1一每次加1直到为10输出
BEGIN
#初始化
SET a int default 1;
loop_label:LOOP
    #循环主体(此时省略了,程序太过于简单)
    
    #迭代条件
    SET a = a + 1;
    #循环条件
    IF a >= 10 THEN LEAVE loop_label;
    END IF;
    
END LOOP loop_label;

END $

循环结构2(WHILE)

while不控制循环:while true

语法格式:

[while_label:]WHILE 循环条件 DO 
        循环体;
END WHILE [while_label];

循环结构3(REPEAT)

类似于DO WHILE,至少执行一次

语法格式:

[repeat_label:]REPEAT
        循环体;
UNTILL 结束循环语句 #没有;
END REPEAT [repeat_label];

跳转语句1(LEAVE)

类似于break,用在循环语句内或是 在BEGIN ...END 中使用,可以跳出循环体或是程序

要跳出谁,给谁加标签

语法格式:

LEAVE 标签名;

举个例子:

 #部分代码不完整
 SET a = a + 1;
 IF a >= 10 THEN LEAVE loop_label;
                         #标签名
 END IF;

跳转语句2(ITERATE)

类似于 continue ,只能在循环语句中使用,跳过本次循环,进入下一次循环

语法格式:

ITERATE 标签名;

游标

什么是游标(光标)

可以定位指定的记录并可以对其操作(充当指针)

使用游标的步骤

游标必须在声明处理程序之前声明,并且变量和条件也必须在声明游标或是处理程序之前声明

  • 第一步:声明游标

MySQL中,使用DECLARE关键字来声明游标,语法格式如下:

DECLARE 游标名 CURSOR FOR 查询语句(结果集);

如果是oracle或是postgresql中,语法格式如下:

DECLARE 游标名 CURSOR IS 查询语句(结果集);
  • 第二步:打开游标
OPEN 游标名;
  • 第三步:使用游标
FETCH 游标名 INTO 查询结果的字段1,字段2,...(要一一对应,名字之间要有关联,这样易调用);
#让游标读取当前行,游标指针指向下一行
  • 第四步:关闭游标
CLOSE 游标名;

如果不及时关闭,游标会占用系统资源,影响系统运行效率

举个例子:

#给出一个工资总和的上限数,让所有员工的工资进行降序排列,并依次相加,直到相加的工资总数大于所给的工资总上限数,计算相加人数

#部分代码(存储过程未写)
上限数:limit_total_salry double(in)
相加人数:total_count int(out)

#声明局部变量(保存每个人的工资,保存相加的数,保存相加人数):
DECLARE emp_sal double;
DECLARE sum_sal int default 0;
DECLARE emp_count int default 0;

#声明游标
DECLARE emp_cursor CURSOR FOR SELECT salary FROM employees ORDER BY salary DESC; 

#打开游标
OPEN emp_cursor;

#使用游标
WHILE sum <= limit_total_salry DO
      FETCH emp_cursor INTO emp_sal;
      SET sum_sal = emp_sal + sum_sal;
      emp_count = emp_count + 1;
END WHILE;

#赋值相加人数
SET total_count = emp_count;

#关闭游标
CLOSE emp_cursor;

游标小结

  • 优点

游标为逐条读取数据提供了解决方案。

可以在存储程序中使用,效率高,程序也会更简洁

  • 不足

会带来一些性能的问题,使用游标会对数据加,在业务并发量大的时候,会损耗系统资源(所以要养成关闭的习惯)

补充:MySQL8.0的新特性—全局变量的持久化

重启服务器后,修改的全局变量依旧有效

MySQL8.0新增了 SET PERSIST 命令,格式如下:

SET PERSIST global 全局变量名字 = 1000;

MySQL会将给命令的配置保存到数据目录下的mysql-auto.cnf文件中,用其中配置文件来覆盖默认的配置文件

原文地址:https://www.cnblogs.com/wht-de-bk/arcHive/2022/03/20/16031615.html

您可能感兴趣的文档:

--结束END--

本文标题: MySQL变量、流程控制和游标

本文链接: https://lsjlt.com/news/9204.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL变量、流程控制和游标
    变量、流程控制和游标 变量 在MySQL数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终的结果的数据 系统变量 变量由系统定义,属于服务器层面 系统变量的分类 每一个MySQL客户机成功连接服务器后,都...
    99+
    2016-07-31
    MySQL变量 流程控制和游标
  • MySQL中的变量、流程控制与游标怎么用
    今天小编给大家分享一下MySQL中的变量、流程控制与游标怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们...
    99+
    2024-04-02
  • MySQL-存储过程、流程控制、游标
    存储过程 存储过程概述 1.产生背景 开发过程总,经常会遇到重复使用某一功能的情况 2.解决办法 MySQL引人了存储过程(Stored Procedure)这一技术 3.存储过程 存储过程就是一条或...
    99+
    2023-10-11
    sql
  • MySQL中流程控制和游标的示例分析
    小编给大家分享一下MySQL中流程控制和游标的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!学习或者了解过编程语言的都知道,任何一门编程语言都不可能只通过一两句语句代码完成。流程控...
    99+
    2024-04-02
  • MySQL中的游标和绑定变量
    目录一、mysql游标简介二、绑定变量2.1 绑定变量的优化2.2 SQL接口的绑定变量2.3 绑定变量的限制一、MySQL游标简介 MySQL在服务器端提供只读的、单向的游标,而且只能在存储过程或者更底层的客户端API...
    99+
    2022-08-17
    MySQL游标 MySQL绑定变量 MySQL变量
  • 【⑰MySQL】 变量 | 循环 | 游标 | 处理程序
    前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL变量 | 循环 | 游标 | 处理程序的分享✨ 目录 前言1. 变量1.1系统变量1.2 用户变量 2. 定义条件...
    99+
    2023-09-06
    mysql 数据库 sql
  • MySQL流程控制
    流程控制 顺序结构: 程序从上往下依次执行分支结构: 程序按条件进行选择执行,从两条或多条路径中选择一条执行。循环结构: 程序满足一定条件下,重复执行一组语句 针对于MySQL的流程控制语句主要有3类。注意:只能用于存储程序 条件判断语...
    99+
    2023-08-22
    mysql
  • Python中的变量、运算符与流程控制
    目录一、执行Python程序的两种方式1、交互式2、命令行式二、变量1、变量的组成2、变量名的定义规范3、定义变量的两种方式4、常量三、Python变量内存管理1、引用计数2、垃圾回...
    99+
    2024-04-02
  • MySQL--流程控制结构
    一、分支结构   #1.if 函数     语法:if(条件  ,  值1,值2)    功能:实现双分支    应用在begin end中或外面        #2.case 结构    语法:    情况1:类似于switch     ...
    99+
    2018-06-17
    MySQL--流程控制结构 数据库入门 数据库基础教程
  • mysql 流程控制函数
    if 函数:if else 的效果 SELECT IF(10<5,'大','小'); #第一个表达式为真则返回第二个参数否则返回第三个 #案例: SELECT last_name, ...
    99+
    2024-04-02
  • Java流程控制break和continue
    目录1.break 关键字1.1语法1.2实例助解2.continue 关键字2.1语法2.2实例助解3.两者区别1.break 关键字 break 主要用在: ① 循环语句中② s...
    99+
    2024-04-02
  • Python中的变量、运算符与流程控制实例分析
    本篇内容主要讲解“Python中的变量、运算符与流程控制实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中的变量、运算符与流程控制实例分析”吧!一、执行Python程序的两种方...
    99+
    2023-06-30
  • Mysql流程控制语句的介绍和使用
    平时绝大部分时间可能都用不到Mysql的流程控制语句,但如果我们需要写存储过程的话,就会用到了。有了流程控制语句,mysql就能想其他编程语言一样写程序了。下面分别来介绍条件分支与循环体。条件分支mysql...
    99+
    2024-04-02
  • MySQL存储过程和游标
    一、存储过程 什么是存储过程,为什么要使用存储过程以及如何使用存储过程,并且介绍创建和使用存储过程的基本语法。什么是存储过程:存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样...
    99+
    2019-12-05
    MySQL存储过程和游标
  • mysql流程控制语句是什么
    这篇文章将为大家详细讲解有关mysql流程控制语句是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。mysql中的流程控制语句包括有:IF语句、CASE语句、LOOP语...
    99+
    2024-04-02
  • python循环控制之break和continue流程控制语句
    目录1.流程控制语 break1.1while循环1.2for循环二、循环控制语 continue1.流程控制语 break 用于结束整个循环结构,直接退出整个循环 例: 用两种循环...
    99+
    2024-04-02
  • MySQL存储过程的传参和流程控制示例讲解
    目录一.存储过程传参—in 演示二.存储过程传参—out 三.存储过程传参—inout 四.流程控制—判...
    99+
    2023-02-10
    MySQL存储过程传参 MySQL流程控制
  • mysql中有哪些流程控制语句
    mysql中的流程控制语句有:1.IF语句,根据不同条件执行不同操作;2.CASE语句,多分支语句结构;3.WHILE循环语句,先判断后执行;4.LOOP循环语句,没有内置的循环条件;5.REPEAT循环语句,先执行后判断;mysql中的流...
    99+
    2024-04-02
  • Linux【实操篇】—— Shell 编程入门、变量、运算符、条件判断、流程控制
    目录 一、Shell 编程入门 1. 认识 Shell 2. Shell 脚本的创建与执行         二、Shell 变量 1. 系统变量和自定义变量 2. 变量的基本规则 3. 设置环境变量 4. 位置参数变量 5. 预定义变量 三...
    99+
    2023-09-01
    linux 服务器 运维 运维开发 Shell
  • 队列技术在PHP与MySQL中的流量控制和队列监控的应用
    随着互联网的快速发展,许多网站和应用程序面临着高并发访问的问题。为了应对这个问题,队列技术应运而生。队列是一种基于先进先出原则的数据结构,常用于异步处理和流量控制。PHP作为一种流行的服务器端语言,与MySQL数据库相结合,广泛应用于网站开...
    99+
    2023-10-21
    队列技术 队列监控 流量控制
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作