目录
前言:
函数
1.无参数函数
2.有参数的函数
定义变量
1.全局变量
2.局部变量
存储过程
1.无参数存储过程
2.有参数存储过程
触发器
sql 指令其实跟编程语言是差不多的,但是不能算作为编程语言,只是有编程语言的特殊是了。好了,那今天我们就一起学习sql语句中的函数,存储过程以及触发器等指令写法。下面就一起来看看吧!
在sql指令中,我们可以去定义一个函数来使用,这样可以提高指令的复用性,提高效率。在sql指令中函数的返回值一般是返回一个结果,也就是说只能返回一个数据类型,不能返回多条数据,一般来讲函数是用于进一步筛选数据来使用的。
函数是用关键字function去修饰的,函数分为有参数函数和无参数函数,跟编程语言是差不多的,下面我会进行分别讲解
当前进行操作的表的数据,如图所示:
1.函数的定义方式:
-- 函数
delimiter 符号 -- 自定义语句结束符号
create function 函数名() returns 返回类型
begin
函数体
return 返回值
end 符号
delimiter;
2.函数的调用方式:
select 函数名(); -- 调用函数
3.函数的删除:
drop function 函数名;
示例1:
-- 定义一个函数
delimiter $$
create function fun() returns char(10)
beginreturn (select name from user where id=12);
end $$
delimiter ;
-- 执行函数
select fun();-- 删除函数
drop function fun;
结果如下所示:

同时我们还发现这函数这里多了一个函数fun,这个函数就是我们创建的函数,当我们要使用的时候就直接去select fun(); 调用就行了,不需要再次创建,如果我们不想要这个函数的话就直接删除就行了,执行drop function fun; 指令
这里要注意函数的返回类型,返回的结果要与类型相对应;同时如果返回字符串类型的时候还要去考虑返回的字符串长度!
有参数的函数定义也就是在无参数的函数里面添加了参数值,跟编程语言的是一样的,如下所示:
-- 定义一个有参数函数
delimiter $$
create function func(cname char(10)) returns int
beginreturn (select pj from user where name=cname);
end $$
delimiter ;
-- 执行函数
select func('韩信');-- 删除函数
drop function func;

一般来说,我们都会去使用有参数函数的,这样更加灵活,方便满足我们的需求.
这里的变量跟编程语言也是一样的,分为全局变量和局部变量,所谓的全局变量就是在函数体等功能体以外的区域去定义的变量,而局部变量就是在功能体以内去定义的变量
定义:
-- 格式:
set @变量名=值;
当我们定义好了一个变量之后就要去执行这个变量,让这个变量实现赋值等相关操作:
set @变量名字=值;
-- 执行:
select @变量名字;
示例:
delimiter %%
create function fun(a int) returns char(10)
beginreturn (select name from user where id=a);
end %%
delimiter ;
-- 定义变量
set @y_id=4;
-- 执行变量
select @y_id;
select fun(@y_id);
局部变量跟全局变量不同,在局部不需要去执行,设置了之后就可以直接去使用了,是先用关键字去定义,然后就直接赋值
-- …………函数体declare 变量名 类型;set 变量名 = 值;
-- …………
示例:
delimiter %%
create function fun() returns char(50)
begindeclare num int; -- 定义变量set num=(select pj from user where id=2); -- 对变量赋值return (select name from user where pj=num);
end %%
delimiter ;
select fun();
存储过程是用关键字procedure修饰的,不同于函数的是,存储过程是可以返回多个结果的,没有特定说返回什么类型,同样存储过程也是分为有参数和无参数的。
建立无参数存储过程
delimiter 符号 --自定义结束符号
create procedure 存储过程名字()
begin 存储过程
end 符号
delimiter ;
调用存储过程
call 存储过程名字(); -- 调用存储过程
删除存储过程
drop procedure;
示例:
-- 创建存储过程
delimiter &&
create procedure cue()
begin-- 这里可以执行多条语句以及返回多条结果update user set name='国服' where id = 14;select *from user;
end &&
delimiter ;
-- 调用存储过程
call cue();
-- 删除存储过程
drop procedure cue;
结果如下所示:
方法跟创建有参数的存储过程是一样的,只需要在里面添加参数即可,看示例:
-- 创建存储过程
delimiter &&
create procedure pro(mid int)
begin-- 这里可以执行多条语句以及返回多条结果update user set name='国服' where id > mid;select *from user;
end &&
delimiter ;
-- 调用存储过程
call pro(10);
-- 删除存储过程
drop procedure pro;

在sql语句中,我们可以设置一些机关指令,也就是触发器,当我们执行某一条语句的时候就会触发这个机关,然后就会执行里面的指令,这个就是触发器的过程。
设置格式如下:
delimiter $$
create trigger 触发器名字 触发时间 触发条件 on
表名 for each row
begin 触发事件
end $$
delimiter ;-- 触发时间 有两个 before 在触发条件之前 after 在触发条件之后
-- 触发条件 insert update delete
-- new 新数据 insert update
-- old 旧数据 update delete
示例:
这里我有两个表,一个是学生表,另一个是班级表,建立一个触发器,当插入学生表数据的时候,班级表的人数会增加1个
class表:
student表: 
#创建一个触发器
delimiter $$
create trigger mech after insert on student for each row
begindeclare oldnum int;set oldnum=(select num from class where cid=NEW.cnum);update class set num=oldnum+1 where cid = NEW.cnum;
end $$
delimiter ;
#插入数据,会引发触发器
insert into student(name,cnum) values ('qq',1);
#删除这个触发器
drop trigger mech;
执行后的结果:
class表中的班级1 人数多了一位。 如果我们去一次性插入多个数据的时候,那么班级表同样也会增加相对应的数量,触发器在mysql后端是非常常见的,可以用与数据的统计等作用。
好了,以上就是本期的全部内容了,我们下一期再见!
分享一张壁纸:
