关于 MySQL 的视图的笔记
视图
- 视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。它可以把查询包装秤一个虚拟表,就可以轻松地检索出相同的数据。视图不包含任何列或数据,包含的是一个查询。
- 视图是虚拟的表。它们包含的不是数据而是根据需要检索数据的查询。视图提供了一种封装 SELECT 语句的层次,可用来简化数据处理,重新格式化或保护基础数据。
使用视图
-
使用视图的好处:
- 重用 SQL 语句。
- 简化复杂的 SQL 操作。在编写查询后,可以方便地重用它而不必知道其基本查询细节。
- 使用表的一部分而不是整个表。
- 保护数据。可以授予用户访问表的特定部分的权限,而不是整个表的访问权限。
- 更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。
-
视图与表:
- 创建视图后,可以用与表相同的方式使用它们。例如:SELECT、过滤、排序、将视图与表或其他视图联接、添加更新数据等等。
- 视图是用来查看存储在别处数据的一种设施,本身不包含数据,因此返回的数据是从其他表中检索出来的。
- 性能问题,如上所述,若用多个联结和过滤创建了复杂的视图或者嵌套多层视图,性能会大幅度下降。在部署使用了大量视图的应用前,应该进行测试。
规则和限制
- 关于视图创建和使用最常见的规则和限制:
- 与表一样,视图必须唯一命名(不能给视图取与别的视图或表相同的名字)。
- 对于可以创建的视图数目没有限制。
- 创建视图,必须具有足够的访问权限。这些权限通常由数据库管理人员授予。
- 视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造视图。所允许的嵌套层数在不同的 DBMS 中有所不同(嵌套视图可能会严重降低查询的性能,因此在产品环境中使用之前,应该对其进行全面测试)。
- 许多 DBMS 禁止在视图查询中使用
ORDER BY
字句(MySQL 中貌似没有限制)。 - 有些 DBMS 要求对返回的所有列进行命名,如果列是计算字段,则需要使用别名。
- 视图不能索引,也不能有关联的触发器或默认值。
- 有些 DBMS 把视图作为只读的查询,这表示可以从视图检索数据,但不能将数据写会底层表。(详情参阅具体的 DBMS 文档)
- 有些 DBMS 允许创建这样的视图,它不能进行导致行不再属于视图的插入或更新。例如有一个视图,只检索带有电子邮件地址的顾客。如果更新某个顾客,删除他的电子邮件地址,将使顾客不再属于视图。这是默认行为,而且是允许的,但有的 DBMS 可能会防止这种情况发生。
创建视图
- 创建视图语句:
1 | CREATE VIEW viewname AS |
- 删除视图语句:(覆盖或更新视图时,必须先删除它,然后再重新创建。)
1 | DROP VIEW viewname; |
利用视图简化复杂的联结
- 创建不绑定特定数据的视图是一种好办法。扩展视图的范围不仅使得它能被重用,而且可能更有用。这样做不需要创建和维护多个类似视图。
1 | # 这是一个例子: |
格式化检索出的数据
- SELECT 约束全部使用。
- MySQL 不支持
+、||
操作符来拼接值,检索出来的结果全为0,但是行数与所求的行数是相同的。要使用函数Concat()
例如:(出处《SQL必知必会》)
1 | select Concat(vend_name, '(', vend_country, ')') |
用视图过滤不想要的数据
1 | # 这是一个例子: |
视图与计算字段
- 使用方法同表。
参考文献:《 SQL 必知必会》