通过视图操作数据
1.可更新视图
要通过视图更新基本表数据,必须保证视图是可更新视图,即可以在 INSET、UPDATE或 DELETE 等语句当中使用它们。对于可更新视图,视图中的行和基本表中的行之间必须具有一对一的关系。如果视图包含下述结构中的任何一种,那么它就是不可更新的。
(1)聚合函数。
(2) DISTINCT关键字
(3) GROUPBY子句。
(4) ORDER BY 子句。
(5)HAVING 子句。
(6) UNION 运算符。
(7) 位于选择列表中的子查询。
(8)FROM子句中包含多个表。
(9) SELECT 语句中引用了不可更新视图。
(10)WHERE子句中的子查询,引用FROM子句中的表。
2.插入数据
当使用视图插入数据时,如果在创建视图时加上WITH CHECK OPTION子句,WITH CHECK OPTION子句会在更新数据的时候检查新数据是否符合视图定义中WHERE 子句的条件。
WITH CHECK OPTION 子句只能和可更新视图一起使用。
当视图所依赖的基本表有多个时,不能向该视图插入数据,因为这将会影响多个基本表。例如,不能向视图jsj_sell插入数据,因为jsj_sell依赖 book 和 sell 两个基本表。
对于INSERT 语句还有一个限制:INSERT语句中必须包含FROM子句中指定表的所有不能为空的列。例如,若jsj_book视图定义的时候不加上“书名”字段,则插入数据的时候会出错。
3.修改数据
使用UPDATE语句可以实现通过视图修改基本表数据。若一个视图依赖于多个基本表,则修改一次该视图只能变动一个基本表的数据。
4.删除数据
如果视图来源于单个基本表,可以使用DELETE语句通过视图来删除基本表数据。
对依赖于多个基本表的视图,不能使用DELETE语句。例如,不能通过对jsj_sell 视图
执行DELETE语句而删除与之相关的基本表book 和 sell 的数据。
5.修改视图定义
使用ALTER 语句可以对已有视图的定义进行修改。语法格式如下。
ALTER VIEW 视图名[(列名列表)]
AS SELECT 语句
[WITH[CASCADED | LOCAL] CHECK OPTION]
ALTER VIEW 语句的语法和CREATE VIEW类似,这里不再赘述。
6.删除视图
语法格式如下。
DROP VIEW [IF EXISTS]视图名1[,视图名2].
如果声明了IF EXISTS,而视图不存在,也不会出现错误信息。使用DROP VIEW可以一次删除多个视图,示例如下。
DROP VIEW jsj_book,jsj_sel1;
上面的语句一次删除了视图jsj_book 和 jsj_sell。
[商业实例] Petstore数据视图
任务1 创建与查询视图
(1) 创建视图account_v1,包含所有男客户的用户号、姓名、密码、性别和电话,字段名用中文表示,同时要求对视图的修改也符合上述条件。
CREATE VIEW account_v1
AS
(SELECT userid AS 用户号,fullname AS 姓名,
password AS 密码,sex AS 性别,phone AS 电话
FROM account where sex='男' )
WITH CHECK OPTION;
(2) 从 account_v1查询姓“张”的客户信息。
SELECT * FROM account_v1 WHERE 姓名 LIKE '张%'
(3) 创建视图 orders_v2,包含订单号、客户姓名和住址、订单日期及订单总价。
CREATE VIEW orders v2
AS
(SELECT orderid, fullname,address,orderdate,totalprice
FROM orders JOIN account
ON (orders,userid-account,userid) );
(4) 从 orders_v2查询 2013 年的订单。
SELECT*FROM orders_v2 WHERE year(orderdate)=2020;
(5) 创建视图lineitem_v3,包含商品名、订单日期、数量和单价,并查询视图。
CREATE VIEW lineitem_v3
AS
(SELECT name,orderdate,quantity,unitprice
FROM lineitem
JOIN orderson (lineitem.orderid=orders.orderid)
JOIN product ON (lineitem.itemid=product.productid));
任务2 操作视图
(1) 在account_v1中插入一条记录“u0007,张华,123456,男,13901234567”。
INSERT INTO account_v1
VALUES ('u0007','张华',"123456','男','13901234567');
(2) 将orders_v2 中订单号为“20130411”的订单总价加200元。
UPDATE orders_v2 SET totalprice =totalprice+200
WHERE orderid =20130411;
(3) 删除视图account_v1中用户号为“u0002”的客户。
DELETE FROM account_v1WHERE用户号='u0002';
(4) 删除视图
orders_v2、lineitem_v3。 DROP VIEW orders_v2,lineitem_v3;