1.视图
视图是虚拟的表。
与包含数据的表不一样,视图只包含使用时动态检索数据的查询。
理解视图的最好方法是看例子。
一般查询:
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 = 'RGAN01'
"SELECT song_init_plays,action_type
FROM songs AS S,useractions AS U
WHERE S.id = U.id"
使用视图:
SELECT cust_name,cust_contact
FROM ProductCustomers
WHERE prod_id = 'RGAN01'
这就是视图的作用。ProductCustomers是一个视图,作为视图,它不包含任何列或数据,包含的是一个查询。
- 定部分的权限,而不是整个表的访问权限。
- 更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。
创建视图之后,可以用与表基本相同的方式使用它们。
可以对视图执行SELECT操作,过滤和排序数据,将视图联结到其他视图或表,甚至添加和更新数据。
重要的是,要知道视图仅仅是用来查看存储在别处数据的一种设施。
视图本身不包含数据,因此返回的数据是从其他表中检索出来的。
在添加或更改这些表中的数据时,视图将返回改变过的数据。
***注意:性能问题
因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时需要的所有检索。
如果你用多个联结和过滤创建了复杂的视图或者嵌套了视图,性能可能会下降得很厉害。
因此在部署使用了大量视图的应用前,应该进行测试。
1.2视图的规则和限制
创建视图前,应该知道它的一些限制。
不过,这些限制随不同的DBMS而不同,因此在创建视图时应该查看具体的DBMS文档。
下面是关于视图创建和使用的一些最常见的规则和限制。
- 与表一样,视图必须唯一命名(不能给视图取与别的视图或表相同的名字)。
- 对于可以创建的视图数目没有限制。
- 创建视图,必须具有足够的访问权限。这些权限通常由数据库管理人员授予。
- 视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造视图。所允许的嵌套层数在不同的DBMS有所不同(嵌套视图可能会严重降低查询的性能,因此在产品环境中使用之前,应该对其进行全面测试)。
- 许多DBMS禁止在视图查询中使用ORDER BY子句
- 有些DBMS要求对返回的所有列进行命名,如果列是计算字段,则需要使用别名。
- 视图不能索引,也不能有关联的触发器或默认值。
- 有些DBMS允许创建这样的视图,它不能进行导致行不再属于视图的插入或更新。
提示:参阅具体的DBMS文档
上面的规则不少,而具体的DBMS文档很可能还包含别的规则。
因此,在创建视图前,有必要花点时间了解必须遵守的规定
2.创建视图
视图用CREATE VIEW语句来创建。
与CREATE TABLE一样,CREATE VIEW只能用于创建不存在的视图。
2.1利用视图简化复杂的联结
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 ProductCust
WHERE prod_id = 'RGAN01'
"SELECT arist_id,user_id FROM songuser WHERE user_id = "adadasd""
视图极大地简化了复杂SQL语句的使用。利用视图,可一次性编写基础的SQL,然后根据需要多次使用。
提示:创建可重用的视图
创建不绑定特定数据的视图是一种好办法。
2.2用视图重新格式化检索出的数据
视图的另一常见用途是重新格式化检索出的数据。
2.3用视图过滤不想要的数据
视图对于应用普通的WHERE子句也很有用。
2.4使用视图与计算字段
在简化计算字段的使用上,视图也特别有用。
视图为虚拟的表。它们包含的不是数而是根据需要检索数据的查询。
视图提供了一种封装SELECT语句的层次,可用来简化数据处理,重新格式化或保护基础数据。