实验8.2 视图的使用

更新于 2026年10月10日 版权声明
实验8.2 视图的使用

【实验目的】

①掌握视图的使用。

②掌握创建视图语句中WITH CHECK OPTION子句的作用。

③理解可更新视图和只读视图的区别。

【实验内容】

①使用v_agentorder视图计算New York的代理商的订单总金额。

②创建custs视图,获得折扣率小于等于15的顾客信息,并且强制视图上执行的所有数据修改语句都必须符合discnt<=15。

③创建agentsales视图,包含所有下过订单的代理商的aid值以及他们的销售总额。通过该视图更新相应基表,查看执行结果。

④对视图v_agentorder执行SQL语句:UPDATE v_agentorder SET month='Jun',查看执行结果。

【实验步骤】

(1)使用视图计算订单总金额

使用v_agentorder视图计算New York的代理商的订单总金额。

①在图标菜单中单击第一个图标 图示,新建一个查询窗口。

②在查询窗口输入下面的SQL语句:

SELECT SUM(dollars) 订单金额总数 FROM v_agentorder
WHERE city='new york';

③单击工具栏中的 图示 图标,执行上面的SQL语句,如图8.5所示。

图示

图8.5 执行结果

(2)创建带有WITH CHECK OPTION的视图

创建custs视图,获得折扣率小于等于15的顾客信息,并且强制视图上执行的所有数据修改语句都必须符合discnt<=15。

①在图标菜单中单击第一个图标 图示,新建一个查询窗口。

②建立custs视图,在查询窗口输入下面的SQL语句:

CREATE VIEW custs AS SELECT * FROM customers WHERE discnt<=15
WITH CHECK OPTION;

③单击工具栏中的 图示 图标,执行上面的SQL语句,如图8.6所示。

图示

图8.6 建立“custs”视图

④新建查询窗口,输入下面的SQL语句:

UPDATE custs SET discnt=discnt+4;

⑤单击工具栏中的 图示 按钮,显示提示如图8.7所示。

图示

图8.7 执行结果

说明:为什么会出现这种报错的情况?因为建立视图时的WITH CHECK OPTION子句要保证通过视图对基表的更新应该符合WHERE条件,即discnt<=15。而customers的内容如图8.8所示,对于顾客c002,discnt增加4后变成16.0,则违背了WHERE条件要求,所以图8.7的UPDATE语句不会执行成功。

图示

图8.8 customers表的内容

思考:如果把UPDATE语句修改为 UPDATE custs SET discnt=discnt+3,是否能成功执行?(https://www.daowen.com)

(3)创建视图agentsales

创建视图agentsales,包含所有下过订单的代理商的aid值以及他们的销售总额。通过该视图更新,查看执行结果。

①在图标菜单中单击第一个图标 图示,新建一个查询窗口。

②建立视图agentsales,在查询窗口输入下面的SQL语句:

CREATE VIEW agentsales(aid,totsales) AS SELECT aid,SUM(dollars)
FROM orders GROUP BY aid;

③单击工具栏中的 图示 图标,执行上面的SQL语句,如图8.9所示。

图示

图8.9 创建视图agentsales

④新建查询窗口,输入下面的SQL语句:

UPDATE agentsales SET totsales=totsales+1000;

⑤单击工具栏中的 图示 图标,执行上面的SQL语句,显示提示如图8.10所示。

图示

图8.10 更新语句执行结果

思考:为什么会出现这种报错的情况?

(4)对视图执行更新语句

对视图v_agentorder执行SQL语句:UPDATE agentorders SET month='Jun',查看执行结果。

①在图标菜单中单击第一个图标 图示,新建一个查询窗口。

②输入下面的SQL语句:

UPDATE v_agentorder SET month='Jun';

③单击工具栏中的 图示 图标,执行上面的SQL语句,显示提示如图8.11所示。

图示

图8.11 视图更新执行结果

说明:这里可能会出现安全模式的错误,需要用户手动关闭安全模式,解决方式是先依次单击MySQL Workbench菜单栏上的“Edit”→“Preferences”,切换到“SQL Editor”页面,关闭安全模式如图8.12所示。

图示

图8.12 关闭安全模式

说明:为什么agentorders的子查询语句包括了两个表,但是这条更新语句能够成功执行呢?因为这个更新语句能够转化为对其基表的更新。

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)