数据库之MySQL(MySQL学习笔记)——数据库视图、触发器、存储过程

数据库视图

  • 什么是视图?
    视图是虚拟表,是对实表的一种映射。
    视图还可以从已经存在的视图的基础上定义。

  • 视图的作用?
    简单性、安全性、逻辑数据独立性
    简单来说:(1)对复杂的sql进行封装
    (2)对数据库敏感信息的保护

  • 视图的创建
    注意:
    (1)视图使用上就和正常的数据表一样
    (2)视图在MySQL中拥有和实体表一样的地位

    题目:制作一个视图提供给销售人员,他们只需要知道商品名称、出售价格、商品的类型 产地信息即可

create view view_sellset as #view 创建视图 	view_selletset 视图名称 
select c.c_name as 商品名称 ,c.c_madein as 商品产地 , ct.ct_name as 商品类型 ,c.c_outprice as 商品售价
from commodity as c inner join commoditytype as ct on c.c_type=ct.ct_id where c.c_outprice is not null;

数据库之MySQL(MySQL学习笔记)——数据库视图、触发器、存储过程_第1张图片
查询视图中的商品名称,商品售价

select 商品名称,商品售价 from view_sellset;

数据库之MySQL(MySQL学习笔记)——数据库视图、触发器、存储过程_第2张图片
修改:因为视图是实表的一种映射,所以通过视图修改表中的数据就是修改实表中的数据。
注意:因为这里的用户名是root,才有权限进行修改;否则是不能进行修改的。

update view_sellset set 商品售价=20 where 商品名称='变形金刚-擎天柱';	#修改变形金刚-擎天柱的售价为20,原来为50;
select * from commodity where c_name='变形金刚-擎天柱';

数据库之MySQL(MySQL学习笔记)——数据库视图、触发器、存储过程_第3张图片

三大范式

(1)第一范式
每一列属性都是不可再分的属性值,确保每一列的原子性。
(2)第二范式(确保表中每列都和主键相关)
一张数据表至少有一个主键。
(3)第三范式(确保每列都和主键列直接相关,而不是间接相关)
一张数据表有且只有一个主键

触发器

  • 触发器创建语法的四大要素:
    (1)监视地点(table):基于表,表示对哪张表进行监控
    (2)监视事件(insert/update/delete):用来监视执行的语句
    (3)触发时间(after/before):在执行命令之前/之后
    (4)触发事件(insert/update/delete):执行的MySQL的命令语句
  • 触发器new old
    (1)insert语句,只有new是合法的。
    (2)delete语句,只有old是合法的。
    (3)update语句,new和old可以同时使用
  • 触发器(插入)
    往订单表中插入数据的触发器
    delimiter:更换标识符
    create trigger tri_1:创建触发器
    begin and相当于{}
delimiter $
create trigger tri_1
after insert on `order`
for each row 
begin 
update commodity set c_num=c_num-new.o_num where c_id=new.o_cid;
end$
delimiter ;

数据库之MySQL(MySQL学习笔记)——数据库视图、触发器、存储过程_第4张图片

select c_name,c_num from commodity where c_id=12;	#先查询商品表中id=12的商品名字,库存
insert into `order` (o_cuid,o_cid,o_num) values (1,12,2);#增加订单表,买了12号商品2个
select c_name,c_num from commodity where c_id=12;#再次查询商品表中id=12的商品名字,库存

数据库之MySQL(MySQL学习笔记)——数据库视图、触发器、存储过程_第5张图片
数据库之MySQL(MySQL学习笔记)——数据库视图、触发器、存储过程_第6张图片

  • 触发器(修改)
delimiter $
create trigger tri_3
after update on `order`
for each row 
begin 
update commodity set c_num=c_num+old.o_num-new.o_num where c_id=old.o_cid;	#c_num就等于把原来购买的数量加回去然后再减去修改后要买的数量
end$
delimiter ;

数据库之MySQL(MySQL学习笔记)——数据库视图、触发器、存储过程_第7张图片

select * from `order`;	#查询订单表,找到要修改的订单id
update `order` set o_num=3 where o_id=8;	#修改订单
select c_name,c_num from commodity where c_id=12;	#修改后查询库存

数据库之MySQL(MySQL学习笔记)——数据库视图、触发器、存储过程_第8张图片

  • 触发器(删除)
delimiter $
create trigger tri_2
after delete on `order`
for each row 
begin 
update commodity set c_num=c_num+old.o_num where c_id=old.o_cid;	#就是把订单表中的值+现在的库存
end$
delimiter ;

数据库之MySQL(MySQL学习笔记)——数据库视图、触发器、存储过程_第9张图片

select * from `order`;	#查询订单表,找到要删除的订单id
delete from `order` where o_id=8;	#删除订单
select c_name,c_num from commodity where c_id=12;	#删除后查询库存

数据库之MySQL(MySQL学习笔记)——数据库视图、触发器、存储过程_第10张图片

存储过程

create procedure sp_name(proc_parameter[...])
begin
[characteristic ...] routine_body
end

sp_name:存储过程名称
proc_parameter:存储过程的参数列表
characteristic:存储过程的特性
routine_body:SQL语句的内容,可以用begin…end来标志SQL语句的开始和结束

delimiter $
create procedure pro_queryall()	#创建存储过程
begin 
select * from commodity;	#存储过程的特性
end$
delimiter ;
 
call pro_queryall();	#输出存储过程的结果
  • 简单的存储案例(查询商品表)
    数据库之MySQL(MySQL学习笔记)——数据库视图、触发器、存储过程_第11张图片
  • 传入in参数的存储案例
delimiter $
create procedure pro_ask(in cu_id int(11))	#传入参数用in,传入的数据类型要和表中的保持一致
begin 
select c_name from commodity where c_id in (
select o_cid from `order` where o_cuid = cu_id);	#查询客户购买的所有商品
end$
delimiter ;

call pro_ask(1);

数据库之MySQL(MySQL学习笔记)——数据库视图、触发器、存储过程_第12张图片

  • 传入out参数的存储案例
delimiter $
create procedure pro_askcnum(in cid int(11),out cnum int(11))	#传入参数时注意不要和表中的字段名一样
begin 
select c_num into cnum from commodity where c_id = cid;	#通过商品id得到商品的库存
end$
delimiter ;


set @cn=-1;	#用来接out传出的值
call pro_askcnum(12,@cn);
select @cn;

数据库之MySQL(MySQL学习笔记)——数据库视图、触发器、存储过程_第13张图片

  • 综合练习
    题目:使用存储过程完成 订单数据的新增
#插入
delimiter $ #修改结束标识符	
create proceduce `insertOrder`(in _o_cuid varchar(50),in _o_cid varchar(50),in _o_num int,out flag int(11))
begin
	set @_c_num=0;	#用来存储c_name的值
	set autocommit=0;	#关闭自动提交
	start transaction;	#开始一个事务标记点
	insert into `order` (o_cuid,o_cid,o_num) values (_o_cuid,_o_cid,_o_num);	#传入客户id,商品id,购买的数量
	set @_c_num=(select c_num from commodity wherec_id=_o_cid);	#通过触发器后得到购买后商品中库存的量
		IF @_c_num>=0 			#如果库存大于0,提交订单
			then commit;
			set flag = 1;		#设置flag=1就是成功,0就是失败
		else rollback;			#否则,回滚
			set flag = 0;
		end if;
	set autocommit=1;		#开启自动提交
end$
delimiter ;	#修改标识符

#修改,逻辑和以上代码思维一致
delimiter $
create proceduce `updateOrder`(in _o_id int(11),in _o_num int(11),out flag int(11))
begin
	set @_c_num=0;
	set autocommit=0;
	start transaction;
	update `order` set o_num=_o_num where o_id=_o_id;
	set @_c_num=(select c_num from commodity where c_id=(select o_cid from `order` where o_id=_o_id));
		IF @_c_num>0 
			then commit;
			set flag = 1;
		else rollback;
			set flag = 0;
		end if;
	set autocommit=1;
end$
delimiter ;

你可能感兴趣的:(MySQL学习笔记)