实验目的
熟悉 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)在对视图进行插入、修改和删除操作时,数据不需要加上单引号,加上单引号就会变为对基本表的插入、修改和删除操作。