(小白)MySQL基础学习006 20201022

6 篇文章 0 订阅

(小白)MySQL基础学习006 20201022

历程

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

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

  1. 创建函数
    自定义函数的几个要素:
    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. 查看函数
    1、通过查询function状态,查看所有function

show function status\G;
2、查看函数的创建语句
show create function my_func1;
在这里插入图片描述

  1. 调用函数
    与内置函数调用相同
    select my_func1(),my_func2(),my_func3(100);
    在这里插入图片描述

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

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

  1. 流程结构案例:
    需求:从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 ;

在这里插入图片描述
在这里插入图片描述

  1. 变量作用域
    局部作用域
    会话作用域
    全局作用域
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();

在这里插入图片描述
在这里插入图片描述

  1. 创建过程体
    在这里插入图片描述
    在这里插入图片描述

  2. 查看过程
    和function一样

  3. 调用过程

call my_pro1();

在这里插入图片描述

  1. 删除过程
    drop procedure my_pro1();

在这里插入图片描述

  1. 存储过程的形参类型

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  1. 触发器
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 使用
    想要生成订单的时候,库存表自动更改
    创建两张表:
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);

在这里插入图片描述
在这里插入图片描述

  1. 创建
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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值