(小白)MySQL基础学习00620201022

it2025-12-15  9

(小白)MySQL基础学习006 20201022

历程

自定义函数 用户自定义,由多条语句组成 矛盾:mysql在遇到分号(;)会自动执行,但自定义函数内多条语句间的间隔又需要分号,解决方法: 修改临时语句结束符 delimiter

delimiter 新符号(非内置符号即可)

创建函数 自定义函数的几个要素: function关键字,函数名,参数(形参和实参【可选】),确认函数返回值类型,函数体,返回值 修改语句结束符 create function 函数名(形参) returns 返回值类型 begin //函数体 return 返回值类型 //数据必须与结构定义的类型一致 end 修改语句结束符(改回来) delimiter $$ create function my_func1() returns int begin return 10; end $$ delimiter ;

并不是所有函数都需要begin和end 如果在一个函数体中,只有一条语句,可以省略

create function my_func2() returns int return 100;

需要为形参指定类型,形参本身可以有多个 变量名 字段类型

create function my_func3(int_1 int,int_2 int) returns int return int_1+int_2; 查看函数 1、通过查询function状态,查看所有function

show function status\G; 2、查看函数的创建语句 show create function my_func1;

调用函数 与内置函数调用相同 select my_func1(),my_func2(),my_func3(100);

删除函数 drop function my_func1; 自定义函数,只有当前用户所属的数据库可以使用 可以在不同的数据库中查看到函数存在,但能使用 函数必须规范返回值,在函数内不能使用select指令,select一旦执行就会得到一个结果result set

select 字段 into @变量;(唯一可用)

流程结构案例: 需求:从1开始,走到用户传入对应的值为止,自动求各,凡是5的倍数都不要 delimiter $$ create function my_sum(end_value int) returns int begin declare res int default 0; declare i int default 1; mywhile:while i<= end_value do if 1%5=0 then set i=i+1; iterate mywhile; end if; set res=res+i; set i=i+1; end while mywhile; return res; end $$ delimiter ;

变量作用域 局部作用域 会话作用域 全局作用域 set @name="张三"; create function my_func4() returns char return @name; select my_func4();

这里需要指定char的长度

set @name="张三"; create function my_func4() returns char(5) return @name; select my_func4();

创建过程体

查看过程 和function一样

调用过程

call my_pro1();

删除过程 drop procedure my_pro1();

存储过程的形参类型

触发器

使用 想要生成订单的时候,库存表自动更改 创建两张表: create table my_goods( id int primary key auto_increment, name varchar(20) not null, inv int )charset utf8;

create table my_orders( id int primary key auto_increment, goods_id int not null, goods_num int not null )charset utf8;

insert into my_goods values(null,“手机”,1000),(null,“电脑”,500),(null,“游戏机”,100);

创建 delimiter $$ create trigger after_insert_order_t after insert on my_orders for each row begin update my_goods set inv=inv-1 where id=1; end $$ delimiter ;

显示触发器

show triggers;

show triggers\G;

查看触发器的创建语句

show create trigger after_insert_order_t;

触发触发器

insert into my_orders values(null,1,1); select * from my_orders; select * from my_goods;

删除触发器:

drop trigger after_insert_order_t;

触发器应用

delimiter $$ create trigger a_i_o_t after insert on my_orders for each row begin update my_goods set inv=inv-new.goods_num where id=new.goods_id; end $$ delimiter ;

select * from my_orders; select * from my_goods;

insert into my_orders values(null,3,5);

如果库存不够

delimiter $$ create trigger b_i_o_t before insert on my_orders for each row begin select inv from my_goods where id=new.goods_id into @inv; if @inv<new.goodS_num then insert into XXX values("XXX"); end if; end $$ delimiter;

select * from my_goods;select * from my_orders;

insert into my_orders(null,3,5);

insert into my_orders values(null,3,500);

最新回复(0)