第十八课 使用视图
一、视图
#视图是虚拟的表。
#与包含数据的表不一样,视图只包含使用时动态检索数据的查询
#MySQL从版本5开始支持视图,较早版本不适用
【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';
#检索订购某种产品的顾客
#需要这个数据的人都必须了解相关表的结构
#知道如何创建查询和对表进行联结
#检索其它产品的相同数据,必须修改最后的WHERE子句
#若把整个查询包装成一个名为productCustomers的虚拟表,则可以轻松检索出上述相同数据
【2】SELECT cust_name, cust_contact FROM productCustomers WHERE prod_id = 'RGAN01';
#此即视图的作用
#productCustomers是一个视图
#productCustomers视图不包含任何列或数据,其包含的是一个查询
注意1:
[1] 所有DBMS一致的支持视图的创建语法
1.1 为什么使用视图:
视图的一些常见应用:
- 重用SQL语句
- 简化复杂的SQL操作。在编写查询后,可以方便地重用它,而不必知道它的基本查询细节
- 使用表的一部分而不是整个表
- 保护数据。可以授权用户访问表的特定部分的权限,而不是整个表的访问权限
- 更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。
#创建视图后,可用与表基本相同的方式使用它们
#可对视图执行SELECT操作,过滤和排序数据,将视图联结到其他视图或表,甚至添加或更新数据
#视图仅仅是用来查看存储在别处数据的一种设施
#视图本身不包含数据,返回的数据是从其他表中检索出来的
#在添加或更改这些表中的数据时,视图将返回改变过的数据
注意2:
性能问题
[1] 视图不包含数据,每次使用视图时,必须处理查询执行时需要的所有检索
[2] 创建复杂的视图或嵌套视图,性能下降可能会很厉害
[3] 在部署使用大量视图的应用前,应该进行测试
1.2 视图的规则和限制:
关于视图创建和使用的一些最常见的规则和限制:
- 与表名一样,视图必须唯一命名(不能给视图取与别的视图或表相同的名字)
- 可创建的视图数目没有限制
- 创建视图必须有足够的访问权限,这些权限由数据库管理人员授予
- 视图可以嵌套,即可以从其他视图中检索数据的查询来构造一个视图,所允许的嵌套层数在不同的DBMS中有所不同
- 许多DBMS禁止在视图查询中使用ORDER BY子句
- 有些DBMS要求对返回的所有列进行命名,如果列是计算字段,则需要使用别名
- 视图不能索引,也不能有关联的触发器或默认值
- 有些DBMS把视图作为只读的查询,这表示可以从视图检索数据,但不能将数据写回底层表
- 有些DBMS允许创建这样的视图,它不能进行导致行不再属于视图的插入或更新
二、创建视图
#视图用CREATE VIEW语句来创建
#与CREATE TABLE一样,CREATE VIEW 只能用于创建不存在的视图
注意2:
视图重命名:
删除视图,可以用DROP语句,其语法为DROP VIEW viewname;
覆盖或更新视图,必须先删除它,然后在重新创建
2.1 利用视图简化复杂的联结:
程序代码(DBMS:MySQL):
CREATE TABLE products2
(
prod_id CHAR(10) NOT NULL,
vend_id CHAR(10) NOT NULL,
prod_name CHAR(254) NOT NULL,
prod_price DECIMAL(8,2) NOT NULl,
prod_desc VARCHAR(1000) NULL
);
参考文献:
【1】《SQL必知必会》第四版 人民邮电出版社 [美] Ben Forta 著 钟鸣 刘晓霞 译