由系统定义,不是用户定义,属于服务器层面。启动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 变量名=变量值;
用户变量是用户自己定义的,作为 MySQL 编码规范,MySQL 中的用户变量以 一个“@” 开头。根据作用范围不同,又分为会话用户变量和局部变量 。
#定义变量
SET @用户变量 = 值;
SET @用户变量 := 值;
SELECT @用户变量 := 表达式[FROM 等子句];
SELECT 表达式 INTO @用户变量 [FROM 等子句]
#查看用户变量的值
SELECT @用户变量;
#声明局部变量
#只在BEGIN和END语句块中有效
#如果没有DEFAULT子句,初始值为NULL
DECLARE 变量名1 变量数据类型 [DEFAULT 变量默认值];
DECLARE 变量名2,变量名3,... 变量数据类型 [DEFAULT 变量默认值];
#为局部变量赋值
SET 变量名1 = 值;
SELECT 值 INTO 变量名2 [FROM 子句];
#查看局部变量
SELECT 变量名1,变量名2,变量3;
定义条件是事先定义程序执行过程中可能遇到的问题, 处理程序 定义了在遇到问题时应当采取的处理方
式,并且保证存储过程或函数在遇到警告或错误时能继续执行。这样可以增强存储程序处理问题的能
力,避免程序异常停止运行。
定义条件就是给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';
可以为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 的流程控制语句
条件判断语句:条件判断语句
循环语句:LOOP、WHILE和REPEAT语句
跳转语句:ITERATE和LEAVE语句
IF语法结构
IF 表达式1 THEN 操作1
[ELSEIF 表达式2 THEN 操作2]……
[ELSE 操作N]
END IF
CASE语法结构
#情况一:类似于switch
CASE 表达式
WHEN 值1 THEN 结果1或语句1(如果是语句,需要加分号)
WHEN 值2 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后面不需要)
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