【MySQL基础】变量、流程控制和游标

目录

  • 一、变量
    • 1.1 系统变量
    • 1.2 用户变量
  • 二、定义条件和处理程序
    • 2.1 定义条件
    • 2.2 定义处理程序
  • 三、流程控制
    • 3.1 分支结构
    • 3.2 循环结构
  • 四、游标

一、变量

1.1 系统变量

由系统定义,不是用户定义,属于服务器层面。启动MySQL服务,生成MySQL服务实例期间,MySQL将为MySQL服务器内存中的系统变量赋值,这些系统变量定义了当前MySQL服务实例的属性、特征。这些系统变量的值要么是编译MySQL时参数的默认值,要么是 配置文件(例如my.ini等)中的参数值。
系统变量分为全局系统变量(需要添加 global 关键字)以及会话系统变量(需要添加 session 关键字),有时也把全局系统变量简称为全局变量,有时也把会话系统变量称为local变量。如果不写,默认会话级别。

#查看所有全局变量
SHOW GLOBAL VARIABLES;
#查看所有会话变量
SHOW SESSION VARIABLES;
SHOW VARIABLES;
#查看满足条件的部分系统变量
SHOW GLOBAL VARIABLES LIKE '%标识符%';
#查看满足条件的部分会话变量
SHOW SESSION VARIABLES LIKE '%标识符%';

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

#为某个系统变量赋值
SET @@global.变量名=变量值;
SET SESSION 变量名=变量值;

1.2 用户变量

用户变量是用户自己定义的,作为 MySQL 编码规范,MySQL 中的用户变量以 一个“@” 开头。根据作用范围不同,又分为会话用户变量和局部变量 。

  • 会话用户变量:作用域和会话变量一样,只对 当前连接 会话有效。
  • 局部变量:只在 BEGIN 和 END 语句块中有效。局部变量只能在存储过程和函数中使用。
#定义变量
SET @用户变量 =;
SET @用户变量 :=;

SELECT @用户变量 := 表达式[FROM 等子句];
SELECT 表达式 INTO @用户变量 [FROM 等子句]

#查看用户变量的值
SELECT @用户变量;

#声明局部变量
#只在BEGIN和END语句块中有效
#如果没有DEFAULT子句,初始值为NULL
DECLARE 变量名1 变量数据类型 [DEFAULT 变量默认值];
DECLARE 变量名2,变量名3,... 变量数据类型 [DEFAULT 变量默认值];
	
#为局部变量赋值
SET 变量名1 =;
SELECTINTO 变量名2 [FROM 子句];

#查看局部变量
SELECT 变量名1,变量名2,变量3;


二、定义条件和处理程序

​ 定义条件是事先定义程序执行过程中可能遇到的问题, 处理程序 定义了在遇到问题时应当采取的处理方
式,并且保证存储过程或函数在遇到警告或错误时能继续执行。这样可以增强存储程序处理问题的能
力,避免程序异常停止运行。

2.1 定义条件

定义条件就是给MySQL中的错误码命名(错误名称自定义)

DECLARE 错误名称 CONDITION FOR 错误码(或错误条件)

错误码

#MySQL_error_code 和 sqlstate_value 都可以表示MySQL的错误。
#违反非空约束的错误类型是“ERROR 1048 (23000)”
#MySQL_error_code是数值类型错误代码。
DECLARE Field_Not_Be_NULL CONDITION FOR 1048;

#sqlstate_value是长度为5的字符串类型错误代码。
DECLARE Field_Not_Be_NULL CONDITION FOR SQLSTATE '23000';

2.2 定义处理程序

可以为SQL执行过程中发生的某种类型的错误定义特殊的处理程序。

DECLARE 处理方式 HANDLER FOR 错误类型 处理语句
#处理方式
CONTINUE:表示遇到错误不处理,继续执行
EXIT:表示遇到错误马上退出
UNDO:表示遇到错误后撤回之前的操作(MYSQL不支持)
#错误类型
SQLSTATE '字符串错误码' :表示长度为5的sqlstate_value类型的错误代码;
MySQL_error_code :匹配数值类型错误代码;
错误名称 :表示DECLARE ... CONDITION定义的错误条件名称。
SQLWARNING :匹配所有以01开头的SQLSTATE错误代码;
NOT FOUND :匹配所有以02开头的SQLSTATE错误代码;
SQLEXCEPTION :匹配所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE错误代码;
#处理语句
如果出现上述条件之一,则采用对应的处理方式,并执行指定的处理语句。语句可以是
像“ SET 变量 = 值 ”这样的简单语句,也可以是使用 BEGIN ... END 编写的复合语句。

三、流程控制

流程就分为三大类:顺序结构、分支结构、循环结构。

#MySQL 的流程控制语句
条件判断语句:条件判断语句
循环语句:LOOPWHILEREPEAT语句
跳转语句:ITERATELEAVE语句

3.1 分支结构

IF语法结构

IF 表达式1 THEN 操作1
[ELSEIF 表达式2 THEN 操作2]…… 
[ELSE 操作N] 
END IF

CASE语法结构

#情况一:类似于switch 
CASE 表达式 
WHEN1 THEN 结果1或语句1(如果是语句,需要加分号) 
WHEN2 THEN 结果2或语句2(如果是语句,需要加分号) 
... 
ELSE 结果n或语句n(如果是语句,需要加分号) 
END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)


#情况二:类似于多重if 
CASE 
WHEN 条件1 THEN 结果1或语句1(如果是语句,需要加分号) 
WHEN 条件2 THEN 结果2或语句2(如果是语句,需要加分号) 
... 
ELSE 结果n或语句n(如果是语句,需要加分号) 
END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)

3.2 循环结构

LOOP语法结构

#一直重复执行直到循环被退出
#loop_label表示LOOP语句的标注名称
[loop_label:] LOOP 
	循环执行的语句 
END LOOP [loop_label]

WHILE语法结构

#先对指定的表达式进行判断,如果为真,就执行循环内的语句,否则退出循环。
#while_label为WHILE语句的标注名称;
[while_label:] WHILE 循环条件 DO 
	循环体 
END WHILE [while_label];

REPEAT语法结构

#REPEAT 循环首先会执行一次循环
#在UNTIL中进行表达式的判断,如果满足条件就退出,即END REPEAT
[repeat_label:] REPEAT 
	循环体的语句 
UNTIL 结束循环的条件表达式 
END REPEAT [repeat_label]

跳转语句LEAVE语法结构

#可以用在循环语句内,或者以 BEGIN 和 END 包裹起来的程序体内(break)
LEAVE 标记名

跳转语句ITERATE语法结构

#只能用在循环语句(LOOP、REPEAT和WHILE语句)内
#表示重新开始循环,将执行顺序转到语句段开头处(continue)
ITERATE label

四、游标

结果集定位到某一 条记录,并对记录的数据进行处理。

游标是一种临时的数据库对象,可以指向存储在数据库表中的数据行指针

声明游标

#MySQL,SQL Server,DB2 和 MariaDB。
DECLARE cursor_name CURSOR FOR select_statement;
#Oracle或者PostgreSQL
DECLARE cursor_name CURSOR IS select_statement;

打开游标

OPEN cursor_name

使用游标

#游标的查询结果集中的字段数,必须跟 INTO 后面的变量数一致
FETCH cursor_name INTO var_name [, var_name] ...

关闭游标

CLOSE cursor_name

你可能感兴趣的:(数据库,mysql,服务器,数据库)