十、视图
1. 为什么使用视图?
- 重用SQL语句。
- 简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必知道它的基本查询细节。
- 使用表的组成部分而不是整个表。
- 保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限。
在视图创建之后,可以用与表基本相同的方式利用它们。可以对视图执行 SELECT操作,过滤和排序数据,将视图联结到其他视图或表,甚至能添加和更新数据。
因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时所需的任一个检索。有可能性能下降的厉害。
2.视图规则。
- 唯一命名。
- 可以创建的视图数目没有限制。
- 为了创建视图,必须具有足够的访问权限。这些限制通常由数据库管理人员授予。
- 视图可以嵌套, 即可以利用从其他视图中检索数据的查询来构造一个视图。
- ORDER BY 可以用在视图中,但如果从该视图检索数据 SELECT 中也含有 ORDER BY ,那么该视图中的 ORDER BY 将被覆盖。
- 视图不能索引,也不能有关联的触发器或默认值。
- 视图可以和表一起使用。例如,编写一条联结表和视图的 SELECT语句。
3.视图的使用。
(1)语法。
- 视图用 CREATE VIEW 语句来创建。
- 使用 SHOW CREATE VIEW viewname;来查看创建视图的语句。
- 用 DROP 删除视图,其语法为 DROP VIEW viewname;
- 更新视图时,可以先用DROP再用CREATE,也可以直接用CEATE OR REPLACE VIEW。如果要更新的视图不存在,则第2条更新语句会创建一个视图;如果要更新的视图存在,则第2条更新语句会替换原
有视图。
(2) 实际使用。
假如我们要找到prod_id为‘TNT2’的订单号、顾客的信息,我们将使用三张表如下:
mysql> select cust_name,cust_contact
-> from customers,orders,orderitems
-> where customers.cust_id = orders.cust_id
-> and orderitems.order_num = orders.order_num
-> and prod_id = 'TNT2';
这样很复杂,我们可以把需要的字段都提炼出来成为一个视图:
mysql> create view productcustomers
-> as select cust_name,cust_contact,prod_id
-> from customers,orders,orderitems
-> where customers.cust_id = orders.cust_id
-> and orderitems.order_num = orders.order_num;
现在我们只要在视图中检索prod_id值为'TNT2'即可。
mysql> select cust_name,cust_contact
-> from productcustomers
-> where prod_id = 'TNT2';
结果一致:
+----------------+--------------+
| cust_name | cust_contact |
+----------------+--------------+
| Coyote Inc. | Y Lee |
| Yosemite Place | Y Sam |
+----------------+--------------+
2 rows in set (0.00 sec)
创建可重用的视图:
扩展视图的范围,有助于我们之后反复使用此视图而不用新建其它的视图。例如我们上面生产所有产品的客户而不仅仅是生产TNT2的客户。这样就可能有助于我们之后的检索了。
视图使用情况:
可以将我们需要的一些值放到视图中,比如连接的新数据:
Create View vendorlocation AS
select concat(RTrim(vend_name),'(',RTrim(vend_Country),')')
as vend_title
from vendors;
这样下次从这个视图里检索数据进行了。
又比如我们可以把非空值的数据都检索到一个视图中,下次查询非空值就可以直接检索这个视图。
我们也可以使用计算字段和视图一起。比如两个列相乘,也可以保存在视图中,之后直接检索这个视图即可。
(3) 视图使用注意。
我们使用视图是为了检索,而不是更新数据。
即使我们也可能可以通过视图来修改数据(这样基表中的数据也会被改变),但是我们不提倡这么做。而且视图中更新数据也很有限制。使用分组,子查询,并,联结,聚集函数,distinct等定义的视图都不能被更新。