什么是视图?
视图是虚拟表,是对实表的一种映射。
视图还可以从已经存在的视图的基础上定义。
视图的作用?
简单性、安全性、逻辑数据独立性
简单来说:(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;
select 商品名称,商品售价 from view_sellset;
修改:因为视图是实表的一种映射,所以通过视图修改表中的数据就是修改实表中的数据。
注意:因为这里的用户名是root,才有权限进行修改;否则是不能进行修改的。
update view_sellset set 商品售价=20 where 商品名称='变形金刚-擎天柱'; #修改变形金刚-擎天柱的售价为20,原来为50;
select * from commodity where c_name='变形金刚-擎天柱';
(1)第一范式
每一列属性都是不可再分的属性值,确保每一列的原子性。
(2)第二范式(确保表中每列都和主键相关)
一张数据表至少有一个主键。
(3)第三范式(确保每列都和主键列直接相关,而不是间接相关)
一张数据表有且只有一个主键
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 ;
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的商品名字,库存
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 ;
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; #修改后查询库存
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 ;
select * from `order`; #查询订单表,找到要删除的订单id
delete from `order` where o_id=8; #删除订单
select c_name,c_num from commodity where c_id=12; #删除后查询库存
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(); #输出存储过程的结果
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);
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;
#插入
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 ;