\quad mysql除了进行增删改查,还提供了变量,函数,流程控制,存储过程,触发器等功能,灵活地满足用户对数据库的需求,提高用户对数据库的操作和管理效率
变量
\quad 根据变量的作用范围,可以将变量划分为系统变量(全局变量),用户变量(会话变量)和局部变量。
1.系统变量
\quad 指的是系统内部定义的变量
-- 查看系统变量
show variables [like 匹配模式];
-- 查看指定名称的系统变量的值
select @@系统变量名
-- 修改系统变量
-- 只对本次连接的客户端有效,局部修改
set 变量名=值
-- 对当前正连接的客户端无效,对之后新连接的客户端永久有效,全局修改
set global 变量名=值
set @@global.变量名=值
2.用户变量
\quad
指的是用户自定义的变量,与当前客户端绑定,仅对当前用户使用的客户端生效。用户变量由@和变量名组成。
\quad
用户变量在定义时必须赋值。 三种赋值方式:
-- 方式一
set @变量名=值
-- 方式二:要用:= 不能用= ,否则得到的是null
select @变量名 :=字段/字段函数 from 表名 [where ....];
-- 方式三,变量只能保存一个数据,所有该方式返回的结果只能是一行记录,而不能是多条记录
select 字段/字段函数 from 表名 [where ....] into @变量名;
3.局部变量
\quad 局部变量的作用范围仅在符合语句begin和end之间,在该语句之外的任何地方都不能被获取和修改,方便在函数和存储过程中保存需要操作的数据。
1)定义
declare 变量名1[,变量名2,...] 数据类型 [default 默认值]
-- 当同事定义多个局部变量时,它们必须是共用同一数据类型,省略默认值是变量的初值为null
2)修改
set 变量名=值
流程控制
\quad mysql提供了判断语句(if,case),循环语句(while,repeat,loop)和跳转语句(leave,iterate)
1.判断语句
1) if语句
1.适用于sql语句的if语法——在一条sql语句中使用
-- 条件表达式为真,返回表达式1的值,否则返回表达式2的值
if(条件表达式,表达式1,表达式2)
2.适合函数,存储过程等的if语法
-- 语句列表必须为一个或多个sql语句,不允许为空
if 条件表达式 then 语句列表
[elseif 条件表达式 then 语句列表]
...
[else 语句表达式]
end if
2)case语句
1)适合sql语句的case语法
# 法一:
case 条件表达式
when 表达式 then 结果
[when 表达式 then 结果]
...
[else 结果]
end
# 法二:
case
when 条件表达式 then 结果
...
[when 条件表达式 then 结果]
[else 结果]
end
2) 适合sql程序的case语法
case 条件表达式
when 表达式 then 语句列表
[when 表达式 then 语句列表]
...
[else 语句列表]
end case
# 法二:
case
when 条件表达式 then 语句列表
...
[when 条件表达式 then 语句列表]
[else 语句列表]
end case
循环语句
1)loop
/*
语句列表为循环执行的语句,在其中需要给出结束循环的条件判断,否则会出现死循环
利用 leave 标签的跳转语句跳出循环
*/
[标签:]loop
语句列表
end loop[标签];
2)repeat语句
/*
无条件执行一次语句列表,然后再判断until后的条件表达式,为真则结束循环,否则继续。
*/
[标签:] repeat
语句列表
until 条件表达式
end repeat [标签]
3)while语句
/*
先判断循环条件,为真执行语句列表,否则结束循环
*/
[标签:]while 条件表达式 do
语句列表
end while [标签]
3.跳转语句
/*
跳转语句用于实现程序执行过程的流程跳转——leave和literate
literate只能用于循环体,而leave还可以在begin...end里使用
literate 用于结束本次循环
leave用于终止循环,跳出循环体
*/
literate 标签;
leave 标签;
函数
\quad mysql除了提供了丰富的内置函数外,还支持用户自定义函数,用于实现某种功能。它由若干条语句组成语句块,每条语句都是一个符合语句定义规范的个体,需要语句结束符" ; ",而mysql一旦遇见语句结束符就会自动开始执行,但函数是一个整体,只有被调用时才会被执行,所以在定义函数时,需要临时修改语句结束符。
-- 新结束符常用 $$
delimiter $$
-- 自定义函数
create function 函数名([参数名 数据类型,...) returns 返回类型
begin
函数体
return 返回值数据; # 类型与returns后一致
end
$$
-- 恢复原结束符
delimiter ;
-- 调用函数
select 函数名(实参列表);
-- 删除函数
drop function [if exists] 函数名;
存储过程
1)创建存储过程
/*
in 表示输入参数
out 表示删除参数,初始值为null
inout 表示输入输出参数,即参数在调用时获得实参值,在操作结束将数据返回给调用者
*/
delimiter $$
create procedure 存储过程名([in | out | inout 参数名称 参数列表])
begin
过程体
end $$
delimiter ;
2)查看存储过程
show procedure status [like 匹配模式]
3)调用存储过程
call 存储过程名([实参列表]);
注意:输出参数名前要加@
触发器
1)定义触发器