MySql系列第三篇,介绍变量,触发器,函数,存储过程,还是一样的味道,还是一样的配方,主打入门
Mysql变量
- 分为两种,一种是系统变量,另一种是自定义变量
- 系统变量 :系统定义好的变量,大部分的时候用户根本不需要使用系统变量,系统变量是用来控制系统表现的 如:
utocommituto_increment_increment - 查看系统变量
how variables(查看所有)select @@变量名 例:select @@ aotocommit;
- 修改系统变量
- 会话级别的:
set 变量名 = 值
- 会话级别的:
- 全局级别:一次修改,永久生效(对所有客户端都生效)
set global 变量名 = 值
- 自定义变量 :
- 系统为了区分系统变量和自定义变量,规定自定义变量必须使用一个@符号
- 语法:
set @变量名 = 值 - mysql中 = 默认当做比较符号处理,所以mysql为了方便 定义了一个新的赋值符号
:=给变量赋值: select @变量名 = 字段名,别名 from 数据源select 字段名,from 数据源 into @变量名- 所有自定义的变量都是会话级别,当次客户端,当次连接有效,(不区分数据库)
触发器(trigger)
- 监视某种情况,并触发某种操作
- 触发器:事件类型,触发时间,触发对象
- 事件类型:增删改,insert,delete,update
- 触发时间:前后;before,after
- 触发对象:表中的每一行记录
- 一张表中最多有6种触发器
- 触发器没有阻止事件发生的能力,比如ajax 在提交之前触发的函数如果返回false则会停止请求,但是触发器没有这样的功能。
- 创建触发器:
delimiter #自定义符号
create trigger #触发器名 触发时间 触发类型 on 表名 for each row
begin...
#这里是触发器内容,每行内容必须使用内容结束符;(分号)
end...
#自定义符号
#将语句结束符恢复回来:
delimiter ;
- 其中:对于insert而言,新插入的行用new来表示,行中的每一列的值用new.列名来 表示。
- 对于delete而言:原本有一行,后来被删除,想引用被删除的这一行,用old来表 示,old.列名可以引用被删除的行的值。
- 对于update而言:被修改的行,修改前的数据,用old来表示,old.列名引用被修改之前行中的值;
- 修改的后的数据,用new来表示,new.列名引用被修改之后行中的值。
- 查看触发器
show triggers或者show trigger 触发器名字 - 删除触发器
drop trigger 触发器名字
Mysql中代码执行结构
分支结构: mysql中只有一种就是if- 基本语法:
if 条件判断 then
满足条件要执行的代码
else
不满足条件要执行的代码
end if ;
循环结构- while循环(没有for )
- 基本语法:
循环名字:while 循环条件 do
循环体
end while ;
- 循环控制:在循环内部进行循环判断和控制
- 注意 mysql中没有
continue和break但是有iterate: 迭代,类似于continue;leave: 离开,类似于break; 使用方式:iterate/leave 循环名字;
函数:
- mysql中函数分为2种,系统函数和自定义函数
- 系统函数 示例:
substring(需要截取的串,从哪开始(第一个字母下标是1),截取长度)- 字符串截取:
char_length(str):字符长度 length(str):字节长度instr(str,substr); 判断substr 是否在str里存在,存在返回位置,失败返回0ABS(x): 返回x的绝对值SUBTIME(): 计算两个时间点的差值DATE(): 提取参数时间表达式中的日期HOUR(): 提取参数时间表达式中的小时TO_DAYS(): 将参数转换为以天为单位计算的数值
- 自定义函数:(函数属于指定某个数据库,不能跨数据库使用)
- 创建语法 :
create function 函数名(形参列表) returns 数据类型 --规定要返回的数据类型
begin
--函数体
-- 返回值,return 返回值(指定的数据类型)
end;
- 查看函数:
show funnction status - 查看函数创建语句:
show create function 函数名 - 删除函数:
drop function 函数名 - 函数作用域
- 全局变量 : 用set关键字声明的,使用@符号标志
- 局部变量: 用declare关键字声明,没有@符号,而且所有局部变量的声明必须在函数体开始之前
-- 生成随机字符
delimiter//
create function getrandm(int_1 int) returns varchar(100)
begin
declare source varchar(70) default '123456789abcdefghiklmnopgrstuvwxyzABCDEFGHIJKLMNOPORSTUVWXY2';
declare i int default 0;
declare target varchar(100) default '' ;
mywhile : while int_1 > i do
set target = CONCAT(target,SUBSTR(source,FLOOR(RAND()*61),1));
set i = i+1;
end while:
return target;
end
//
delimiter ;
存储过程
- 存储过程简称过程(
procedure),是一种用来处理数据的方式 - 存储过程是一种没有返回值的函数
- 创建过程:
create procedure 过程名(参数列表)
begin
--过程体
end;
- 查看过程: 和查看函数一样就是将function 换成 procedure
- 调用过程:过程没有返回值,所以select不能用,select只会找function,调用有专门的关键字:
call; - 删除过程:过程不能修改,只能先删除再创建;
drop procedure 过程名 - 存储过程的参数有三种限制:
- in : 数据只能从外部传给内部使用,可以是数值也可以是变量
- out : 只允许过程内部使用,内部改变会影响外部,类似引用传递。 只能是变量
- inout:外部可以在内部使用,内部修改也可以给外部使用,典型的引用传递,只能传变量
- 使用:
create procedure 名字 (in int_1 int,out int_2 int,inout int_3 int) - 注:out/inout 类型局部变量改变之后不会瞬间同步到全区变量,是滞后的,会等到过程执行完成,将值付给全局变量。in类型的不改
demiliter //
create procedure cc(in start int,in num int)
BEGIN
declare i int DEFAULT 0;
ww: while i<num DO
insert into student value(start+i,sname(),sname(),sage());
set i = i+1;
end whiler
END //
delimiter ;