0%

【MySQL】变量&存储过程&函数&流程控制结构

MySQL最后的一些基础知识


1 变量

1.1 分类

  • (1)系统变量
    • 全局变量
    • 会话变量
  • (2)自定义变量
    • 用户变量
    • 局部变量

1.2 系统变量

  • 变量由系统提供,不是用户定义,属于服务器层面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 查看全局|会话变量(不写global / seesion 默认为session)
show global | session variables;


# 模糊查询系统变量
show global | session variables like '%变量值%';


# 查看特定系统变量
select @@global | session.系统变量名;


# 系统变量赋值
#(1)
set global| session 系统变量名 = 值;

#(2)
set @@global | session.系统变量名 = 值;
  • 全局变量:
    • 作用域:服务器每次启动将为所有的全局变量赋初始值,这对所有的会话有效,但不能跨重启
  • 会话变量:
    • 作用域:仅仅针对当前会话有效

1.3 自定义变量

  • 变量是用户自定义的,不是由系统提供
  • 用户变量
    • 作用域:针对于当前会话有效
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 声明并初始化(三者都可以)
set @用户变量名=值;
ser @用户变量名:=值;
select @用户变量名名:=值;


# 赋值
set @用户变量名=值;
ser @用户变量名:=值;
select @用户变量名名:=值;

select 字段 into @变量名 from 表;


# 使用用户变量
select @用户变量名;
  • 局部变量
    • 仅仅定义在它的begin end中有效
    • 应用在 begin and 中的第一句话
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 声明
declare 变量名 类型;
declare 变量名 类型 default 值;


# 赋值(注意是否带@)
set 局部变量名=值;
ser 局部变量名:=值;
select @局部变量名名:=值;

select 字段 into 局部变量名 from 表;


# 使用局部变量
select 局部变量名;

1.4 总结

变量 作用域 定义和使用的位置 语法
用户变量 当前会话 会话中的任何地方 必须添加@符号,不用限定类型
局部变量 begin end 中 只能在begin end中,且为第一句话 一般不用添加@符号,需要限定类型

2 存储过程

2.1 介绍

  • 存储过程和函数:类是Java中的方法,封装了一系列的执行逻辑
  • 优点:简化操作

2.2 存储过程

  • 定义:一组预先编译好的SQL语句的集合
  • 优点
    • (1)提高了代码的重用性,一旦编译过一次就不需再次编译
    • (2)简化操作
    • (3)减少了编译次数并且减少了和数据库服务器连接次数,提高了效率
  • 参数模式
    • in:默认值,修饰的参数作为输入,需要调用方传入值
    • out:该参数作为输入,意思为作为返回值
    • inout:该参数既可以作为输入,也可以作为输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 创建存储过程
create procedure 存储过程名(参数列表)
begin
存储过程体(一组合法sql,每条sql用;隔开)
end 结束标记
参数列表:参数模式 参数名 参数类型


# 设置结束标记(存储过程结束要用指定结束标记)
delimiter 结束标记;


# 方法调用
call 存储过程名(实参列表) 结束标记


# 删除存储过程
drop procedure 存储过程名;


# 查看存储过程结构
show create procedure 存储过程名;

2.3 存储过程演示

  • (1)in演示
    • 输入班级编号,查询班级名称
  • (2)out演示
    • 输入学生姓名,返回班级编号
  • (3)inout演示
    • 输入一个值,返回该值的两倍(简单运算)

3 函数

3.1 介绍

  • 函数和存储过程几乎一样,只是返回值有不同
  • 区别:
  • 存储过程:可以有0个返回,或有多个返回。时候做批量插入、批量更新
  • 函数:有且仅有1个返回,适合做处理数据后返回一个结果

3.2 语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建函数
create funciton 函数名(参数列表) returns 返回类型
begin
函数体(函数体最后需要return语句)
end

参数列表:参数名 参数类型


# 调用函数
select 函数名(实体参数);


# 查看函数结构
show create function 函数名;


# 删除函数
drop function 函数名;

3.3 函数演示

  • 传入学生信息,返回学生成绩
  • 若创建函数出现以下错误
  • 解决方法:set global log_bin_trust_function_creators=true

4 流程控制结构

4.1 介绍

  • 顺序结构:程序从上往下依次执行
  • 分支结构:程序从两条或多条路径中选一条出执行
  • 循环结构:程序在满足一定条件的基础上,重复执行一段代码

4.2 分支结构

  • (1)if函数
    • 语法:if(判断表达式, true表达式, false表达式)
    • 解释:判断表达式返回true,就返回true表达式值,否则返回false表达式的值
    • 作用域:任何地方法
  • (2)case结构
    • 情况1:类似java中的switch语句,一般用于实现等值判断
    • 情况2:类似java中的多重if语句,一般用于实现区间判断
    • 可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,begin end中或begin end的外面
    • 可以作为独立的语句去使用,只能方法begin end中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 情况1(作为语句时,最后要加case)
case 变量|表达式|字段
when 要判断的值 then 返回值1[语句1]
when 要判断的值 then 返回值2[语句2]
...
else 返回值n[语句n]
end [case];


# 情况2
case
when 要判断的条件 then 返回值1[语句1]
when 要判断的条件 then 返回值2[语句2]
...
else 返回值n[语句n]
end [case];
  • (3)if结构
    • 实现功能多重分支
    • 应用场景:只能应用在begin end中
1
2
3
4
5
if 条件1 then 语句1;
elseif 条件2 then 语句2;
...
else 语句n;
end if;

4.3 循环控制

  • 分类:while、loop、repeat
  • 循环控制
    • iterate类似使用continue,结束本次循环,继续下一次
    • leave类似于break,跳出,结束
  • (1)while
1
2
3
4
5
6
7
8
9
10
# 一般情况
while 循环条件 do
循环体
end while;


# 搭配循环控制使用(需要带标签)
标签:while 循环条件 do
循环体
end while 标签;
  • (2)loop
    • 一个死循环,需要循环控制来跳出循环
1
2
3
4
# 同while需要使用循环控制要添加标签
[标签:]loop
循环体
end loop [标签]
  • (3)repeat
    • 类似Java的do while
1
2
3
4
5
# 与上同理
[标签:]repeat
循环体
until 结束循环条件
end repeat [标签]