用视图过滤不想要的数据
视图对于应用普通的 WHERE 子句也很有用。例如,可以定义customeremaillist 视图,它过滤没有电子邮件地址的客户。为此目的,可使用下面的语句:
输入:create view customeremaillist as select cust_id,cust_name,cust_email from customers where cust_email is not null;
分析:显然,在发送电子邮件到邮件列表时,需要排除没有电子邮件地址的用户。这里的 WHERE 子句过滤了 cust_email 列中具有NULL 值的那些行,使他们不被检索出来。
现在,可以像使用其他表一样使用视图 customeremaillist 。
输入:select * fromcustomeremaillist;
输出:
WHERE 子句与 WHERE 子句 如果从视图检索数据时使用了一条WHERE 子句,则两组子句(一组在视图中,另一组是传递给视图的)将自动组合。
使用视图与计算字段
视图对于简化计算字段的使用特别有用。下面是第10章中介绍的一条 SELECT 语句。它检索某个特定订单中的物品,计算每种物品的总价格:
输入:select prod_id,quantity,item_price,quantity*item_price as expanded_price from orderitems where order_num = 20005;
输出:
为将其转换为一个视图,如下进行:
输入:create view orderitemsexpanded as select prod_id,quantity,item_price,quantity*item_price as expanded_price from orderitems;
为检索订单 20005 的详细内容(上面的输出),如下进行:
输入:select * from orderitemsexpanded where order_num = 20005;
输出:
可以看到,视图非常容易创建,而且很好使用。正确使用,视图可极大地简化复杂的数据处理。
更新视图
迄今为止的所有视图都是和 SELECT 语句使用的。然而,视图的数据能否更新?答案视情况而定。
通常,视图是可更新的(即,可以对它们使用 INSERT 、 UPDATE 和DELETE )。更新一个视图将更新其基表(可以回忆一下,视图本身没有数据)。如果你对视图增加或删除行,实际上是对其基表增加或删除行。
但是,并非所有视图都是可更新的。基本上可以说,如果MySQL不能正确地确定被更新的基数据,则不允许更新(包括插入和删除)。这实际上意味着,如果视图定义中有以下操作,则不能进行视图的更新:
1.分组(使用 GROUP BY 和 HAVING );
2.联结;
3.子查询;
4.并;
5.聚集函数( Min() 、 Count() 、 Sum() 等);
6.DISTINCT;
7.导出(计算)列。
换句话说,本章许多例子中的视图都是不可更新的。这听上去好像是一个严重的限制,但实际上不是,因为视图主要用于数据检索。
可能的变动 上面列出的限制自MySQL 5以来是正确的。不过,未来的MySQL很可能会取消某些限制。
将视图用于检索 一般,应该将视图用于检索( SELECT 语句)而不用于更新( INSERT 、 UPDATE 和 DELETE )。
总结:
视图为虚拟的表。它们包含的不是数据而是根据需要检索数据的查询。视图提供了一种MySQL的 SELECT 语句层次的封装,可用来简化数据处理以及重新格式化基础数据或保护基础数据。