数据库(视图、触发器、存储过程)
视图
视图的概念
视图是一个虚拟表,是从数据库中一个或者多个表中导出来的表,视图还可以从已存在的的视图的基础上定义
视图在MySQL中拥有和实体表一致的地位,所以在使用上就和正常的数据表一致
视图的使用
创建视图
create view view_name as select…
view_name 视图名称 select…语句是你所要在 这个视图中展示的字段
查看视图
show tables; 该操作与表一致
删除视图
drop view view_name;与表操作一致
更新视图
更新视图指的是更新视图中数据的字段值
insert into插入一个数据
update 更新一个数据
delete 删除一个数据create view myview as # 创建视图 #将c_name字段在视图中展示为商品名称字段 select c_name as 商品名称,c_inprice as 商品进价,ct_id as 商品类型 #ct_id为commoditytype表的字段 这边使用内连接 from commodity,commoditytype where ct_id=c_type; #插入一条数据,虽然插入的是在视图中,但是在实体表中真实插入了数据 insert into myview values(...) 注意:视图的插入操作只能是针对单表的完全映射才能插入数据 #修改一条视图数据 update myview set 商品进价=100 where 商品名称='手办'; 注意:视图的修改会直接影响实体表的数据 #删除一条视图数据 删除商品名称为手办的商品数据 delete from view where 商品名称='手办'; 注意:视图的删除会直接删除实体表的数据
视图的优点
使用视图可以使得数据更加的安全
对信息进行保护,和对复杂的SQL语句进行封装
触发器
触发器的概念
即当发生某一事件时,如果满足给定条件,则执行相应的捆绑事件
触发器的使用
create trigger 触发器名称
after|before insert on tableName(表名) # after和before是指 在tableName插入数据(之前|之后)触发绑定的事件
for each row #监视每一行的数据
begin #代表绑定事件的开始
绑定的触发事件
end; #代表绑定事件的开始
触发器的new 和 old
insert语句中 只有 new 可用
delete语句中 只有 old 可用
update 语句中 new old 都可以使用#修改SQL语句结束的默认结束符为$,因为绑定事件的结束符为;不修改则不能完成触发器的编写 delimiter $ create trigger mytri #创建mytri插入触发器 after insert on `order` #在order表被插入数据时 执行绑定事件 for each row begin #绑定的事件为 更新commodity表中c_num的值 update commodity set c_num = c_num-new.o_num where c_id=new.o_cid; ###此处的new可以引用insert的order表中的所有字段 end$ delimiter ; #写完触发器别忘记把默认的结束符改回来 创建删除触发器 delimiter $ create trigger mytri2 after delete on `order` #监视order表,若出现删除操作,则触发绑定的事件 for each row begin update commodity set c_num=c_num+old.o_num where c_id=old.o_cid; ##此处的old为 delete时 可以引用order表的所有字段 end$ delimiter ; 创建修改触发器 delimeter $ create trigger mytri3 after update on `order` #监视order表,当order出现update操作时,触发事件生效 for each row begin ##更新commodity中c_num的值 update commodity set c_num=c_num+old.o_num-new.o_num where c_id=new.o_cid; end$ delimiter ;
触发器的作用
存储SQL语句,可以减少代码的复写量
存储过程
存储过程的概念
将一系列的SQL语句操作封装起来,使用时方便调用,类似于方法的调用
存储过程的使用
创建存储过程
create procedure 名称(参数列表)
begin
sql语句…(方法体)
end;
参数有传入参数和返回参数,分别用 in和out修饰,当然参数列表也可以为空
删除存储过程
drop procedure 名称
调用存储过程
call 存储过程名称传出参数的存储过程创建 delimiter $ #修改默认结束符 create procedure mypro(in cnum int(11)) #in表示该参数是传入的,int(11) 是该参数的类型 begin select c_name from commodity where c_num=cnum; #筛选出c_num等于cnum的数据的c_name end$ delimiter ; call mypro(100); #调用存储过程 这边参数给了100,就是筛选出c_num=100的数据 传出参数的存储过程创建 delimiter $ #修改默认结束符 create procedure mypro1(out cid int(11)) begin select c_id into cid from commodity where c_num=10; #筛选出c_num为10的数据的id,并赋值给传出参数 cid (这里使用into进行赋值操作) end; delimiter ; #将默认结束符修改回; call mypro1(); #调用mypro1存储过程,由于没有传入参数,,所以不需要参数 删除存储过程 drop procedure mypro1;
存储过程的作用
1.存储过程的SQL语句是已经编译过得,执行效率更高
2.存储过程可以有传入参数和传出参数(返回值) 可以直观的知道SQL语句有没有运行成功
3.存储过程比较稳定,不会有太大的错误
…