实验目的:熟悉SQL语言有关视图的操作,能够熟练使用SQL语句来创建需要的视图,定义数据库外模式,并能使用所创建的视图实现数据管理。
实验内容:
1. 实验任务 环境:PHPStudy 针对给定的数据库,以及相应的应用需求,创建视图和带with check option的视图,并验证视图with check option选项的有效性。理解和掌握视图消解执行原理,掌握可更新视图和不可更新视图的区别。
2. 实验步骤
(1) 创建视图:V_DLMU_PartSupp1,创建一个“海大汽配”供应商供应的零件视图V_DLMU_PartSupp1,要求列出供应零件的编号,零件名称,可用名称,可用数量,零售价格,供应价格和备注等信息。
(2) 创建视图:V_CustAvgOrder,按顾客统计平均每个订单的购买金额和零件数量,要求输出顾客编号,姓名,平均购买金额和平均购买零件的数量。
(3) 创建视图:V_DLMU_PartSupp2,使用with check option,创建一个“海大汽配”供应商供应的零件视图V_DLMU_PartSupp2,要求列出供应零件的编号,可用数量,供应价格等信息。然后通过该视图分别,增加,删除和修改一条“海大汽配”零件供应记录,验证with check option是否起作用。
(4) 可更新的视图(行列子集视图)创建一个“海大汽配”供应商供应的零件视图V_DLMU_PartSupp3,要求列出供应零件的编号,可用数量,供应价格等信息。然后通过该视图分别增加,删除和修改一条“海大汽配”零件供应记录,验证该视图是否是可更新的,并比较上述“(3)创建视图,V_DLMU_PartSupp2”实验任务与本任务结果有何异同。
(5) 不可更新的视图:(2)中创建的视图是可更新的吗?通过更新语句加以验证,并说明原因。删除视图(restrict/cascade):创建顾客订购零件明细视图V_CustOrd,要求列出顾客编号,姓名,购买零件数,金额,然后在该视图的基础上,再创建与(2)的视图一样结构的视图V_CustAvgOrder1,然后使用restrict选项删除视图V_CustOrd,观察现象并检查V_CustAvgOrder1是否存在,解释原因。
程序:phpStudy.exe;mysql 5.7
#1.创建视图:V_DLMU_PartSupp1#
create view V_DLMU_PartSupp1 as
select P.partkey,P.name,PS.availqty,P.retailprice,PS.supplycost,P.comment
from Part P,PartSupp PS,Supplier S
where P.partkey=PS.partkey and S.suppkey=PS.suppkey and S.name='海大汽配';
show create view V_DLMU_PartSupp1;
#2.创建视图:V_CustAvgOrder 使用group by语句#
create view V_CustAvgOrder(custkey,cname,avgprice,avgquantity) as
select C.custkey,MAX(C.name),AVG(O.totalprice),AVG(L.quantity)
from Customer C,Orders O,Lineitem L
where C.custkey=O.custkey and L.orderskey= O.orderskey
group by C.custkey;
#5. 2视图V_CustAvgOrder不可更新,不可插入,没有授权插入权限#
insert into V_CustAvgOrder
values(100000,null,20,2000);
#3.创建视图:V_DLMU_PartSupp2,使用check option语句#
create view V_DLMU_PartSupp2
as
select partkey,suppkey,availqty,supplycost
from PartSupp
where suppkey=(
select suppkey
from Supplier
where name='海大汽配')
with check option;
#V_DLMU_PartSupp3的插入,修改,删除#
insert into V_DLMU_PartSupp2 values(58889,5048,704,77760);
update V_DLMU_PartSupp2
set supplycost=12
where suppkey=58889;
delete from V_DLMU_PartSupp2
where suppkey=58889;
#4.可更新的视图(行列子集视图)创建V_DLMU_PartSupp3#
create view V_DLMU_PartSupp3
as
select partkey,suppkey,availqty,supplycost
from PartSupp
where suppkey=(
select suppkey
from Supplier
where name='海大汽配');
#V_DLMU_PartSupp3的插入,修改,删除#
insert into V_DLMU_PartSupp3 values(58889,5048,704,77760);
describe view V_DLMU_PartSupp3;
update V_DLMU_PartSupp3
set supplycost=12
where suppkey=58889;
delete from V_DLMU_PartSupp3
where suppkey=58889;
#6.删除视图(restrict/cascade)#
create view V_CustOrd(custkey,cname,qty,extprice)
as
select C.custkey,C.name,L.quantity,L.extendedprice
from Customer C,Orders O,Lineitem L
where C.custkey=O.custkey and O.orderskey= L.orderskey;
create view V_CustAvgOrder1(custkey,cname,avgprice,avgquantity)
as
select custkey,MAX(cname),AVG(qty),AVG(extprice)
from V_CustOrdgroup by custkey;
drop view V_CustOrd restrict;
drop view V_CustOrd cascade;