MySQL基础_8_ 变量 流程控制与游标

!说明:最近5天看了尚硅谷康师傅(强推JVM)的MySQL基础篇,分享一下笔记,mark,mark!

一、变量

  • 分为系统变量与用户自定义的变量

1、系统变量

  • 系统变量分为全局系统变量(需要添加global关键字)和会话系统变量(需要添加session关键字)
    • 全局系统变量:针对所有的会话有效,但不能跨重启
    • 会话系统变量:仅针对当前的会话有效,会话期间,当前的会话对某个绘画系统变量的修改,不会影响其他会话同一个绘画系统变量的值

1)查看

# 查看所有全局变量
SHOW GLOBAL VARIABLES;

# 查看所有的会话变量
SHOW SESSION VARIABLES;SHOW VARIABLES;

# 查看满足条件的变量
SHOW GLOBALSESSION VARIALBES LIKE '格式';

# 查看指定的系统变量
SELECT @@global.变量名;    # 全局
SELECT @@session.变量名;		# 会话
或者SELECT @@变量名;				# 该情况会先查询会话,再查询全局

2)修改

  • 方式1:修改MySQL配置文件中的系统变量的(需重启生效)
  • 方式2:在MySQL运行时,使用SET命名重新设置系统变量值(只针对当前的服务,MySQL重启后失效)
# 1 修改全局变量
SET @@变量名 =;
或者SET GLOBAL 变量名 =;

# 2 修改会话变量
SET @@变量名 =;
或者SET SESSION 变量名 =;
# 该情况下设置仅针对当前会话有效,结束会话便失效

2、用户变量

  • MySQL中的用户变量以一个@开头(主要修饰会话用户变量)
  • 根据作用范围的不同,又分为会话用户变量和局部变量
    • 会话用户变量:作用域和会话变量相同,只对当前的会话有效
    • 局部变量:只能使用在存储过程或者函数中

1)会话用户变量声明和赋值

# 1 方式1
SET @用户变量名 =;
或者SET @用户变量名 :=# 2 方式2
SELECT @用户变量名 := 表达式(FROM ...);
SELECT 表达式 INTO @用户变量名 [FROM ...];

2)局部变量

  • 声明必须在BEGIN后跟的首行位置,声明并使用在BEGIN… END中(使用在存储过程或者函数中)
  • 必须使用DECLARE声明
  • 声明需要指定类型
# 1 定义
DECLARE 变量名 类型 [default]

# 2 赋值
SET 变量名 =;
或者SET 变量名 := 值
或者SELECT 表达式 INTO 变量名 [FROM ...];

# 3 查询
SELECT 变量名
# 示例 使用局部变量
DELIMITER &

create procedure add_value()
BEGIN
	# 声明
    declare value1, value2, sum_val int;
    
    # 赋值
    SET value1 = 10;
    SET value2 = 200;
    SET sum_val = value1 + value2;
    
    # 使用
    select sum_val;
END &

DELIMITER ;

call add_value();

二、程序出错的处理机制

1、定义条件和处理程序

  • 定义条件:事先定义程序执行中可能遇到的问题
  • 处理程序:定义了在遇到问题应当采取的处理方式,并且保证存储过程或函数在遇到警告或者错误时能继续执行。

1)定义条件

  • 就是给MySQL的错误码命名

DECLARE 错误名称 CONDITION FOR 错误码

  • 错误码有两种
    • MySQL_error_code是数值类型错误代码
    • sqlstate_value是长度为5的字符串类型错误代码
# 定义条件的创建
# 1 方式1 - MySQL_error_code
DECLARE 名称 CONDITION FOR 数值

# 定义2 - sqlstate_value
DECLARE 名称 CONDITION FOR SQLSTATE 字符转

2)定义处理程序

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

DECLARE 处理方式 HANDLER FOR 错误类型 处理语句

  • 处理方式
    • CONTINUE:遇到错误不处理,继续执行
    • EXIT:要到错误马上退出
    • UNDO:遇到错误撤回之前的操作,MySQL暂不支持这样的操作
  • 错误类型
    • SQLSTATE ‘字符串错误码’:
    • MySQL_error_code
    • 错误名称:
    • SLQWARNING:匹配所有01开头的SQLSTATE错误码
    • NOT FOUND:匹配所有02开头的SQLSTATE错误码
    • SQLEXCEPTION:匹配所有没被SQLWARNINGNOT FOUND捕获的SQLSTATE错误码

三、流程控制

  • 条件判断结构:IF语句,CASE语句
  • 循环结构:LOOP语句,WHILE语句,REPEAT语句
  • 跳转结构:ITERATE语句,LEAVE语句

1、分支结构IF

  • 语法
IF 表达式1 THEN 操作1
[ELSEIF 表达式2 THEN 操作2]
...
[ELSE 操作N]
END IF

2、分支结构CASE

  • 语法
# 1 类似switch
CASE 表达式
WHEN1 THEN ...
WHEN2 THEN ...
...
ELSE ...
END[case] # 如果是放在BENGIN...END需要加上case,若放在SELECT中则不需要加case

# 2 类似多重的if
CASE
WHEN 条件1 THEN ...
WHEN 条件2 THEN ...
...
ELSE ...
END[case] # 如果是放在BENGIN...END需要加上case,若放在SELECT中则不需要加case

3、循环结构

  • 循环结构具备的要素
    • 初始化条件
    • 循环条件
    • 循环体
    • 迭代条件

1)LOOP

[loop_label:]LOOP 结束循环条件
		循环体
END LOOP[loop_label];

# 其中结束循环的条件,一般是
IF 结束条件 
		THEN LEAVE loop_lab;
END IF;

2)WHILE

[while_label:]WHILE 循环条件 DO
		循环体
END WHILE [while_label];

3)REPEAT

[repeat_label:]REPEAT
		循环体的语句
UNTIL 结束循环的条件表达式
END REPEAT [repeat_label]

4)对比

  • 这三种循环结构可以省略名称,但如果循环中添加了循环控制语句(LEAVEITERATE)则必须添加名称
  • LOOP一半用于实现简单的死循环
  • WHILE先判断后执行
  • REPEAT先执行后判断,无条件至少执行一次

4、迭代条件

  • 使用迭代条件都是必须要对循环结构或者其他结构添加名称

1)跳转语句LEAVE

LEAVE 标签名

2)跳转语句ITERATE

  • 只能在循环语句中使用,表示重新开始循环,将执行的顺序转到语句段开头处,类似于

ITERATE 标签名


四、游标

  • 游标使得对查询结果中的每一条记录进行定位,并对指向的记录进行操作的数据结构
  • 充当了指针的作用

1)使用游标

  • 声明

DECLARE 游标名 CURSOR FOR SELECT...

  • 打开游标

OPEN 游标名

  • 使用游标(从游标中获得数据)

FETCH 游标名 INTO 变量1, 变量2...

  • 关闭

CLOSE 游标名

2)注意

  • 游标的查询字段,必须与INTO后跟的变量数一致
  • 游标会占用系统资源,如果不及时关闭,游标会一直保持到存储1过程或函数的结束,应当及时关闭
  • 游标实现逐条读取结果集中的数据
  • 游标也会带来一些问题,在使用游标时,会对数据加锁,在高并发时,会影响业务之间的效率同时消耗系统资源

五、MySQL8.0中的全局变量新特性

  • MySQL8.0新增SET PERSIST命令,使得在会话时通过该命令修改的全局系统变量的值,在系统重启后仍保留设置

SET PERSIST global 变量名 = 值;

  • MySQL会将该命令的配置保存到数据目录下的mysqld-auto.cnf文件中,下次重启的时候会读取该文件的值,来覆盖默认的配置文件

你可能感兴趣的:(MySQL基础学习笔记分享,java,sql,mysql)