一、变量

在mysql数据库中,变量分为系统变量以及用户自定义变量。

1、系统变量

1.1 介绍

系统变量由系统定义,属于服务器层面。启动mysql服务,生成mysql服务实例期间,mysql将为mysql服务器内存中的系统变量赋值。这些系统变量要么时编译mysql时参数的默认值,那么是配置文件中的参数值。可以通过网址https://dev.mysql.com/doc/refman/8.0/server-system-variables.html查看mysql文档的系统变量。

1.2 分类

系统变量分为全局系统变量(需要添加global关键字)和会话系统变量(需要添加session关键字)。
全局系统变量又叫全局变量,会话系统变量又叫local变量。如果不写,默认会话级别。
静态变量(在mysql服务实例运行期间不能使用set动态修改)属于特殊的全局变量。

  • 全局变量针对所有会话有效,但不能跨重启。
  • 会话系统变量仅针对当前会话有效,不会影响其他会话。
  • 有些变量只能是全局的,例如max_connections用于限制服务器最大连接数;有些写哦那个变量既可以是全局又可以是会话,例如character_set_client用于设置客户端的字符集;有些系统变量只能是当前会话,例如pseudo_thread_id用于标记当前会话的mysql连接id。

1.3 查看系统变量

show global variables; // 查看全局系统变量
show session variables; // 查看会话系统变量
show variables; // 默认查询会话系统变量
show variables like '' // 查看部分系统变量

在mysql中系统变量以@@开头,其中@@global用来标记全局系统变量,@@session用来标记会话系统变量,@@首先标记会话系统变量,如果会话变量不存在则标记全局变量。

select @@global.变量名;
select @@session.变量名;
select @@变量名;

1.4 修改系统变量

方式1:修改mysql的配置文件
方式2:在服务运行期间,使用set命令重新设置系统变量的值

set @@global.变量名 = 变量值
或者
set global 变量名 = 变量值

2、用户变量

2.1 分类

用户变量是用户自己定义的,根据作用范围不同,又分为会话用户变量和局部变量。

  • 会话用户变量: 作用域和会话变量一样,只对当前连接会话有效。用@表示
  • 局部变量:只在begin和end语句块中有效,局部变量只能在存储过程和函数中使用。

2.2 使用

定义会话用户变量

方式一:set中使用 = 或 :=
set @用户变量 = 值;
set @用户变量 := 值;方式二:select中使用 := 或into关键字
select @用户变量 := 表达式 from ...
select 表达式 into @用户变量 from ...

查看会话用户变量

select @变量名

定义局部变量
局部变量必须使用declare声明,必须在begin…end中,必须在首行的位置。

declare 变量名 类型[default 值]; // 如果没有default子句,初始值为null

3、定义条件与处理程序

定义条件是实现定义程序执行过程中可能遇到的问题,处理程序定义了在遇到问题时应当采取的处理方式。保证存储过程和函数在遇到警告或错误时能继续执行。
当存储过程中执行sql语句报错时,mysql数据库会抛出错误,并退出当前sql逻辑,不再向下执行。

3.1 定义条件

定义条件就是给mysql中的错误命名,有助于错误更清晰。它将一个错误名字和指定的错误条件关联起来,这个名字可以再随后定义处理程序的declare handler语句中。

declare 错误名 condition for 错误码(或错误条件)

3.2 错误码说明

  • mysql_error_code是数值类型错误代码。
  • sqlstate_value是长度为5的字符串类型错误代码。

例如ERROR 1418(HY000)中,1414是mysql_error_code,HY000是sqlstate_value。

3.3 定义处理程序

可以为sql执行过程中发生的某种类型的错误定义特殊的处理程序。定义处理程序时,使用declare语句的语法如下:

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

4、mysql8.0新特性—全局变量的持久化

在mysql数据库中,全局变量可以通过set global语句来设置。但是数据库重启后,服务器又会从mysql配置文件中读取变量的默认值。mysql8.0版本新增了set persist命令。

set persist max_connections = 1000;

mysql会将该命令的配置保存到数据目录下的mysqld-auto.cnf文件中,下次启动会读取该文件,用其中的配置来覆盖默认的配置文件。


二、流程控制

1. 介绍

解决复杂问题不可能只通过一个sql语句完成,我们需要执行多个sql操作。流程控制语句的作用就是控制存储过程中sql语句的执行顺序。
流程分为三大类:

  • 顺序结构:程序从上往下依次执行
  • 分支结构:程序按条件进行选择执行,从两条或多条路径中选择一条执行。
  • 循环结构:程序满足一定条件下,重复执行一组语句。

针对mysql流程控制语句主要有3类:

  • 条件判断语句:if和case
  • 循环语句:loop、while和repeat语句
  • 跳转语句:iterate和leave语句

2.分支结构

if语句

if 表达式1 then 操作1
[elseif 表达式2 then 操作2]
[else 操作n]
end if

case语句

case 表达式
when 值1 then 结果1(如果是语句,需要加分号)
when 值2 then 结果2(如果是语句,需要加分号)
...
else 结果n或语句n
end [case] (如果是在begin end中需要加上case,如果放在select后面不需要)
case
when 条件1 then 结果1(如果是语句,需要加分号)
when 条件2 then 结果2(如果是语句,需要加分号)
...
else 结果n或语句n
end [case] (如果是在begin end中需要加上case,如果放在select后面不需要)

3.循环结构

loop循环语句用来重复执行某些语句。loop内的语句一直重复执行直到循环被退出(遇到leave子句),跳出循环。

[loop_label:] Loop循环执行的语句
end loop [loop_label]
[while_label:] while 循环条件 do循环执行的语句
end while [while_label]
[repeat_label:] repeat循环执行的语句;
until 循环语句结束条件表达式 end repeat [repeat_label]

loop一般用于实现简单”死循环“;while先判断后执行;repeat先执行后判断,无条件至少执行一次;

leave 标记名 可以跳出循环或者跳出程序体,相当于break;
iterate 标记名 跳过当前循环,相当于continue;


三、游标

游标可以在结果集中像指针一样,向前定位一条记录,向后一条记录或者随意定位一条记录。

1. 声明游标

在mysql中,使用declare关键字来声明游标,其语法基本形式如下:

declare cursor_name CURSOR FOR select_statement;

这个语法适用于mysql,sqlserver,db2和mariaDB。如果是用Oracle或者postgresql,需要写成:

declare cursor_name CURSOR IS select_statement;

2.打开游标

打开游标的时候select语句的查询结果集就会送到游标的工作区,为后面游标的逐条读取结果集中的记录做准备。

open cursor_name;

3.使用游标

语法如下:

FETCH cursor_name into 变量名,...

注意,游标的查询结果集中的字段数,必须跟into后面的变量数一致。变量必须在声明游标前就定义好。
游标用完后必须关闭游标,应为游标会占用系统资源。如果不及时关闭,游标会一直保存到存储过程结束,影响系统运行的效率。关闭之后,就不能检索查询结果中的数据行,如果需要检索只能再次打开游标。

close cursor_name

游标一般在循环体中使用,应为每调一次fetch都会将光标指向下一条记录。

4.例子

MySql基础篇——变量、流程控制与游标相关推荐

  1. Java基础篇3——流程控制

    Java基础篇3--流程控制 1.顺序结构 正常代码的流程即是顺序流程 2.分支结构 2.1.if-else分支 if(条件表达式) {语句块1; } if(条件表达式) {语句块1; } else ...

  2. python自学流程-python 学习之 基础篇三 流程控制

    前言: 一. python中有严格的格式缩进,因为其在语法中摒弃了"{}"来包含代码块,使用严格的缩进来体现代码层次所以在编写代码的时候项目组要严格的统一器缩进语法,一个tab按键 ...

  3. C#基础篇三流程控制2

    using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace P01Re ...

  4. Python接口自动化测试框架(基础篇)-- 流程控制之循环语句forwhile

    前言 很开心,python学到循环语句了,也越来越好玩了,学到这儿,基本上也能处理一些流水线的工作了,只是稍欠装饰显得不那么灵活.复用性不高. 循环语句 python中循环语句有for和while:如 ...

  5. MySql基础篇---004 其它数据库对象篇:视图,存储过程与函数,变量、流程控制与游标 ,触发器

    第14章_视图 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. 常见的数据库对象 对象 描述 表(TABLE) 表是存储数据的逻辑单元,以行和列的形 ...

  6. 一条一条来,MySQL变量、流程控制与游标,完整详细可收藏

    文章目录 1. 变量 2. 定义条件与处理程序 3. 流程控制 4. 游标 MySQL8的新特性-全局变量的持久化 1. 变量 在MySQL数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间 ...

  7. 变量、函数、流程控制与游标

    实验七:变量.函数.流程控制与游标 实验内容与完成情况(记录所有的实验过程): 1. 使用局部变量.全局变量 (1)定义一个tinyint的整型变量,为其赋值68,并显示变量的值. declare @ ...

  8. 最全MySQL基础篇

    文章目录 导入表的问题 第三章_最基本的SELECT语句 1. SQL语言的规则和规范 1) 基本规则 2) SQL大小写规范(建议遵守) 3) 注释 4) 命名规则 2. 基本的SELECT语句 1 ...

  9. C#面向对象程序设计课程实验一:实验名称:C#语言基础、程序流程控制

    C#面向对象程序设计课程实验一:实验名称:C#语言基础.程序流程控制 实验内容:C#语言基础.程序流程控制 一. 实验目的 二.实验环境 三.实验内容 四.实验总结 实验内容:C#语言基础.程序流程控 ...

最新文章

  1. JS高级程序设计拾遗
  2. 程序员之天梯排行榜 | 每日趣闻
  3. esp8266 SDK开发之编译流程
  4. 重要接口—Cloneable接口
  5. 如何优雅的处理异常?SpringBoot全局异常与数据校验
  6. linux+PATH
  7. 3.4 改进定向搜索
  8. php 打包下载网络图片,php多张图片打包下载
  9. zabbix--自动注册
  10. 牛客网暑期ACM多校训练营(第三场) J Distance to Work 计算几何求圆与多边形相交面积模板...
  11. 一些osu的皮肤下载
  12. 智能家居离线语音识别控制系统设计(SU-03T)
  13. 如何判断一家软件公司是否靠谱
  14. 什么人最适合读研呢?你适不适合读研究生?
  15. MySQL中创建时间和更新时间的自动更新
  16. Android动画制作
  17. 刚体6D位姿估计方法综述
  18. HTML5游戏开发–第10课
  19. 人脸识别APP技术开发
  20. 大学生职业生涯规划书

热门文章

  1. linux 下建立硬链接和软连接
  2. 经典IIR数字滤波器设计一般步骤的总结
  3. python scipy.optimize.minimize多变量多参数优化
  4. 关于cv.waitKey
  5. sql优化(面试必问一)
  6. 诺基亚Symbian算不算智能手机?
  7. 未封装的扩展程序是什么意思_网线上面的标识代表什么意思?网线的九大扩展应用...
  8. 【JAVA 学习笔记】HashMap 探究
  9. 人工神经网络技术基础
  10. 判断三角形是何种三角形的测试用例