数据库实验四 视图实验

实验目的

熟悉 SQL 语言有关视图的操作,能够熟练使用 SQL 语句来创建需要的视图,定义数据库外模式,并能使用所创建的视图实现数据管理。

实验内容和要求

针对自建数据库 test 创建视图和带 with check option 的视图,并验证 with check
option 选项的有效性。理解和掌握视图消解执行原理,掌握可更新视图和不可更新视图的 区别。

实验步骤和实验结果

(1)创建一个“河北省华信集团”供应商供应的零件视图 Viewpart1,要求列出供应商编号、供应商名称、零件编号、零件名称、可用数量、零售价格和供应价格:

CREATE VIEW Viewpart1 AS SELECT
supplier.suppkey AS suppkey,
supplier.NAME AS sname,
part.partkey AS partkey,
part.NAME AS pname,
partsupp.availqty AS availqty,
part.retailprice AS rprice,
partsupp.supplycost AS supplycost 
FROM
	supplier,
	part,
	partsupp 
WHERE
	supplier.suppkey = partsupp.suppkey 
	AND part.partkey = partsupp.partkey 
	AND supplier.NAME = '河北省华信集团'; 

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

(2)创建一个视图 viewcust1,按顾客统计 2020 年订单的购买总金额和零件总数量,要求输出顾客编号、姓名、购买总金额和购买零件总数量:
创建视图:

CREATE VIEW ViewCust1 AS SELECT
customer.custkey AS custkey,
customer.NAME AS NAME,
SUM( totalprice ) AS total_buy,
SUM( quantity ) AS total_quantity 
FROM
	customer,
	lineitem,
	orders 
WHERE
	orders.custkey = customer.custkey 
	AND orders.orderkey = lineitem.orderkey 
	AND YEAR ( orderdate )= '2022' 
GROUP BY
	orders.orderkey 
HAVING
	SUM( totalprice ) 
	AND SUM( quantity ) 
ORDER BY
	customer.custkey 

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

针对刚创建的视图:
·插入一条记录,看看是否能通过验证,并说明原因:

INSERT INTO viewcust1
VALUES
	( '1', '刘娅', '88888.00', '100' );

在这里插入图片描述

不能通过验证,该视图中部分字段来自聚集函数,聚集函数不能更新。
·查询购买总金额超过 10 万的顾客信息:

SELECT
	* 
FROM
	viewcust1 
WHERE
	total_buy > '100000';

在这里插入图片描述

(3)创建一个“河北钢铁集团有限公司”供应商供应的零件视图 Viewpart2,列出零件编号、供应商编号、可用数量和供应价格:

CREATE VIEW viewpart2 AS SELECT
partkey,
suppkey,
availqty,
supplycost 
FROM
	partsupp 
WHERE
	suppkey IN ( SELECT suppkey FROM supplier WHERE supplier.NAME = '河北钢铁集团有限公司' );

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

通过该视图分别增加、删除和修改一条“河北钢铁集团有限公司”零件供应记录 :
·增加一条记录:

INSERT INTO viewpart2
VALUES
	( 2222, 24706, 288, 2828.28 );

在这里插入图片描述

·修改一条记录:

UPDATE viewpart2 
SET supplycost = 3382.34 
WHERE
	partkey = 2222;

在这里插入图片描述

·删除一条记录:

DELETE 
FROM
	viewpart2 
WHERE
	partkey = '2222';

(4)用 with check option 创建一个“河北钢铁集团有限公司”供应商供应的零件视图 viewpart3( 字段同viewpart2 ):
·创建视图:

CREATE VIEW viewpart3 AS SELECT
partkey,
suppkey,
availqty,
supplycost 
FROM
	partsupp 
WHERE
	suppkey IN ( SELECT suppkey FROM supplier WHERE supplier.NAME = '河北钢铁集团有限公司' ) WITH CHECK OPTION;

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

通过该视图分别增加、删除和修改一条“河北钢铁集团有限公司”零件供应记录,验证是否可更新,并比较和“(3)”的实验结果有无异同:
·增加一条记录:

INSERT INTO viewpart2
VALUES
	( 2222, 24706, 288, 2828.28 );

在这里插入图片描述

·修改一条记录:

UPDATE viewpart3 
SET availqty = 745 
WHERE
	partkey = 1229;

在这里插入图片描述

·删除一条记录:

DELETE 
FROM
	viewpart3 
WHERE
	partkey = '1229';

在这里插入图片描述

(5)创建顾客订购零件明细视图 viewcust2,列出顾客编号、姓名、购买零件数、金额:

CREATE VIEW viewcust2 ( custkey, NAME, sum_quantity, sum_totalprice ) AS SELECT
customer.custkey,
customer.NAME,
SUM( quantity ),
SUM( totalprice ) 
FROM
	lineitem,
	customer,
	orders 
WHERE
	customer.custkey = orders.custkey 
	AND lineitem.orderkey = orders.orderkey 
GROUP BY
	customer.custkey; 

在这里插入图片描述

在该视图的基础上再创建视图 viewcust3,列出每个顾客的平均购买零件数和平均金额,显示顾客编号、姓名、平均购买零件数、平均金额:

CREATE VIEW viewcust3 ( custkey, NAME, avg_quantity, avg_price ) AS SELECT
viewcust2.custkey,
viewcust2.NAME,(
	viewcust2.sum_quantity / BIT_COUNT( orders.orderkey )),(
	viewcust2.sum_totalprice / BIT_COUNT( lineitem.orderkey ) 
) 
FROM
	viewcust2,
	orders,
	lineitem 
WHERE
	viewcust2.custkey = orders.custkey 
	AND orders.orderkey = lineitem.orderkey 
GROUP BY
	viewcust2.custkey;

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

删除视图 viewcust2:

DROP VIEW viewcust2;
SELECT *
FROM viewcust2;

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

删除视图viewcust2后,在该视图中建立的视图viewcust3依然存在。

实验总结

(1)视图三大规则:
如果一个视图是由多个表连接操作导出的,那么不允许对这个视图进行更新操作。
如果一个视图在创建过程中使用了GROUP BY或聚集函数,那么也不允许对这个视图进行更新操作。
如果一个视图是由单个基本表投影和选择导出的,就允许对这个视图进行更新操作。
(2)在对视图进行插入、修改和删除操作时,数据不需要加上单引号,加上单引号就会变为对基本表的插入、修改和删除操作。

猜你喜欢

转载自blog.csdn.net/gui_bjyxszd/article/details/127721453