数据库学习笔记

145 阅读4分钟

数据库学习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的前一行