MySQL 视图

关于 MySQL 的视图的笔记

视图

  • 视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。它可以把查询包装秤一个虚拟表,就可以轻松地检索出相同的数据。视图不包含任何列或数据,包含的是一个查询。
  • 视图是虚拟的表。它们包含的不是数据而是根据需要检索数据的查询。视图提供了一种封装 SELECT 语句的层次,可用来简化数据处理,重新格式化或保护基础数据。

使用视图

  • 使用视图的好处:

    1. 重用 SQL 语句。
    2. 简化复杂的 SQL 操作。在编写查询后,可以方便地重用它而不必知道其基本查询细节。
    3. 使用表的一部分而不是整个表。
    4. 保护数据。可以授予用户访问表的特定部分的权限,而不是整个表的访问权限。
    5. 更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。
  • 视图与表:

    1. 创建视图后,可以用与表相同的方式使用它们。例如:SELECT、过滤、排序、将视图与表或其他视图联接、添加更新数据等等。
    2. 视图是用来查看存储在别处数据的一种设施,本身不包含数据,因此返回的数据是从其他表中检索出来的。
    3. 性能问题,如上所述,若用多个联结和过滤创建了复杂的视图或者嵌套多层视图,性能会大幅度下降。在部署使用了大量视图的应用前,应该进行测试。

规则和限制

  • 关于视图创建和使用最常见的规则和限制:
    1. 与表一样,视图必须唯一命名(不能给视图取与别的视图或表相同的名字)。
    2. 对于可以创建的视图数目没有限制。
    3. 创建视图,必须具有足够的访问权限。这些权限通常由数据库管理人员授予。
    4. 视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造视图。所允许的嵌套层数在不同的 DBMS 中有所不同(嵌套视图可能会严重降低查询的性能,因此在产品环境中使用之前,应该对其进行全面测试)。
    5. 许多 DBMS 禁止在视图查询中使用 ORDER BY 字句(MySQL 中貌似没有限制)。
    6. 有些 DBMS 要求对返回的所有列进行命名,如果列是计算字段,则需要使用别名。
    7. 视图不能索引,也不能有关联的触发器或默认值。
    8. 有些 DBMS 把视图作为只读的查询,这表示可以从视图检索数据,但不能将数据写会底层表。(详情参阅具体的 DBMS 文档)
    9. 有些 DBMS 允许创建这样的视图,它不能进行导致行不再属于视图的插入或更新。例如有一个视图,只检索带有电子邮件地址的顾客。如果更新某个顾客,删除他的电子邮件地址,将使顾客不再属于视图。这是默认行为,而且是允许的,但有的 DBMS 可能会防止这种情况发生。

创建视图

  • 创建视图语句:
1
2
3
4
5
CREATE VIEW viewname AS 
SELECT field_name1, field_name2, field_name3
FROM table_name1, table_name2, table_name3
WHERE table_name1.... = table_name2....
AND table_name2.... = table_name3....;
  • 删除视图语句:(覆盖或更新视图时,必须先删除它,然后再重新创建。)
1
DROP VIEW viewname;

利用视图简化复杂的联结

  • 创建不绑定特定数据的视图是一种好办法。扩展视图的范围不仅使得它能被重用,而且可能更有用。这样做不需要创建和维护多个类似视图。
1
2
3
4
5
6
7
8
9
10
11
# 这是一个例子:
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;


select cust_name, cust_contact
from ProductCustomers
where prod_id = 'RGAN01';

格式化检索出的数据

  • SELECT 约束全部使用。
  • MySQL 不支持+、||操作符来拼接值,检索出来的结果全为0,但是行数与所求的行数是相同的。要使用函数Concat()例如:(出处《SQL必知必会》)
1
2
3
select Concat(vend_name, '(', vend_country, ')') 
from Vendors
order by vend_name;

用视图过滤不想要的数据

1
2
3
4
5
6
7
8
9
# 这是一个例子:
create view CustomerEmailList as
select cust_id, cust_name, cust_email
from Customers
where cust_email is not null;



select * from CustomersEmailList;

视图与计算字段

  • 使用方法同表。



参考文献:《 SQL 必知必会》