10、视图

1. 为何使用视图?

  • 重用SQL语句。
  • 简化复杂的SQL操做。在编写查询后,能够方便地重用它而没必要知道它的基本查询细节。
  • 使用表的组成部分而不是整个表。
  • 保护数据。能够给用户授予表的特定部分的访问权限而不是整个表的访问权限。

在视图建立以后,能够用与表基本相同的方式利用它们。能够对视图执行 SELECT操做,过滤和排序数据,将视图联结到其余视图或表,甚至能添加和更新数据。mysql

由于视图不包含数据,因此每次使用视图时,都必须处理查询执行时所需的任一个检索。有可能性能降低的厉害。sql

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';

结果一致:code

+----------------+--------------+
| 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;

这样下次从这个视图里检索数据进行了。it

又好比咱们能够把非空值的数据都检索到一个视图中,下次查询非空值就能够直接检索这个视图。

咱们也可使用计算字段和视图一块儿。好比两个列相乘,也能够保存在视图中,以后直接检索这个视图便可。

(3) 视图使用注意。

==咱们使用视图是为了检索,而不是更新数据。==

即便咱们也可能能够经过视图来修改数据(这样基表中的数据也会被改变),可是咱们不提倡这么作。并且视图中更新数据也颇有限制。使用分组,子查询,并,联结,汇集函数,distinct等定义的视图都不能被更新。

相关文章
相关标签/搜索