十、视图

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等定义的视图都不能被更新。

原文地址:https://www.cnblogs.com/love-jelly-pig/p/10368653.html