数据库学习2024/3/20
变量、流程控制与游标
1.变量
1.1系统变量(全局系统变量、会话系统变量)vs 用户自定义变量
1.2查看系统变量
查看全局变量
SHOW GLOBAL VARIABLES;
查看会话变量
SHOW SESSION VARIABLES;
SHOW VARIABLES #无添加默认是查看会话变量
1.3查看指定系统变量
查看全局变量的值
SELECT @@global.变量名;
查看会话变量的值
SELECT @@session.变量名;
查看变量的值
SELECT @@变量名;#先看会话变量有没有,没有则看全局变量
1.4修改系统变量的值
方式1:
SET @@(系统变量/会话变量).变量名 = 变量值;
方式2:
SET @@(系统变量/会话变量) 变量名 = 变量值;
全局变量针对于当前的数据库是有效的,一旦重启MySQL服务,就失效了
会话变量针对于当前的数据库是有效的,一旦重连MySQL服务,就失效了
1.5用户变量
①用户变量:会话用户变量 vs 局部变量
② 会话用户变量:使用"@"开头,作用域是当前会话
③ 局部变量:只能使用在存储过程或存储函数中
1.6会话用户变量:
方式1:“=”或“:=”
SET @用户变量 = 值;#作用于单个值
SET @用户变量 := 值;
方式2:“:=” 或 INTO关键字
SELECT @用户变量 := 表达式 [FROM 等子句];#作用于字段
SELECT 表达式 INTO @用户变量 [FROM 等子句]
使用(查看)语法:
SELECT @用户变量;
1.7局部变量:
声明局部变量
DECLARE 变量名1 变量数据类型 [DEFAULT 变量默认值]; #默认值是NULL
DECLARE 变量名2,变量名3,... 变量数据类型 [DEFAULT 变量默认值];
为局部变量赋值
SET 变量名1 = 值;
SELECT 值 INTO 变量名2 [FROM 子句];
查看局部变量的值
SELECT 变量1,变量2,变量3;
总结:①必须使用DECLARE声明
②使用在BEGIN...END之间
③DECLARE声明方法必须在BEGIN...END首行
1.8局部变量的赋值
方式1:“=”或“:=”
SET @用户变量 = 值;
SET @用户变量 := 值;#作用于单个值
方式2:INTO关键字
SELECT 表达式 INTO 用户变量 FROM 等子句;#作用于字段
使用(查看)语法:
SELECT @用户变量;
2.定义条件和处理程序
2.1定义条件:
DECLARE 错误名称 CONDITION FOR 错误码(或错误条件)
#使用错误条件时注意是字符串,且 FOR后要加 SQLSTATE
2.2定义处理程序
#格式
DECLARE 处理方式 HANDLER FOR 错误类型 处理语句 #处理方式:contune(不处理错误继续运行)、exit(遇到错误马上退出)
3.流程控制
3.1if的使用
IF 表达式1 THEN 操作1
[ELSEIF 表达式2 THEN 操作2]… … [ELSE 操作N]
END IF
3.2 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后面不需要)
4 循环结构
循环必备4要素: 1.初始化条件 2.循环条件 3.循环体 4.迭代条件
除了循环条件后面不用加;其他要素都要加;
4.1 LOOP循环
[loop_label:]是起一个别名
[loop_label:] LOOP
循环执行的语句
END LOOP [loop_label]
4.2 whlie循环
[while_label:]是起一个别名 (可以不写)
[while_label:] WHILE 循环条件 DO
循环体
END WHILE [while_label];
4.3 repeat循环
[while_label:]是起一个别名 (可以不写)
[repeat_label:] REPEAT
循环体的语句
UNTIL 结束循环的条件表达式
END REPEAT [repeat_label]
对比三种循环结构:
1、这三种循环都可以省略名称,但如果循环中添加了循环控制语句(LEAVE或ITERATE)则必须添加名 称。
**2、 LOOP:一般用于实现简单的"死"循环 **
**3、WHILE:先判断后执行 **
4、REPEAT:先执行后判断,无条件至少执行一次
5 跳转语句
5.1 leave语句:
5.1.1 特点:①类似break
②使用在单独的begin...end中或在循环中使用(通常和LOOP一起使用)
LEAVE 标记名
5.2 inerate语句
5.2.2 inerate的特点:①只能应用于循环语句
**②类似Java中的continue **
③inerate语句必须跟在循环标志前面
LEAVE 标记名 #label参数表示循环的标志。
6 游标
6.1 游标的特点:①必须在存储过程或存储函数中使用
②必须在变量的后面
6.2 声明游标
cursor_name(游标名) select_staememt(查询语句)
DECLARE cursor_name CURSOR FOR select_statement;
6.3 打开游标
OPEN cursor_name;
6.4 使用游标
FETCH cursor_name INTO var_name
#使用游标在循环中使用
游标读取的数据行有多个列名在 into 后必须有相应的变量名一一对应
6.5 关闭游标
CLOSE cursor_name;
关闭游标写在后面,就在end的前一行