!说明:最近5天看了尚硅谷康师傅(强推JVM)的MySQL基础篇,分享一下笔记,mark,mark!
一、变量
- 分为系统变量与用户自定义的变量
1、系统变量
- 系统变量分为全局系统变量(需要添加
global
关键字)和会话系统变量(需要添加session
关键字)- 全局系统变量:针对所有的会话有效,但不能跨重启
- 会话系统变量:仅针对当前的会话有效,会话期间,当前的会话对某个绘画系统变量的修改,不会影响其他会话同一个绘画系统变量的值
1)查看
# 查看所有全局变量
SHOW GLOBAL VARIABLES;
# 查看所有的会话变量
SHOW SESSION VARIABLES;
或
SHOW VARIABLES;
# 查看满足条件的变量
SHOW GLOBAL|SESSION 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
:匹配所有没被SQLWARNING
或NOT 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 表达式
WHEN 值1 THEN ...
WHEN 值2 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)对比
- 这三种循环结构可以省略名称,但如果循环中添加了循环控制语句(
LEAVE
或ITERATE
)则必须添加名称 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文件中,下次重启的时候会读取该文件的值,来覆盖默认的配置文件