例子
SELECT cust_name, cust_contact
FROM customers, orders, orderitems
WHERE customers.cust_id = orders.cust_id
AND orderitems.order_num = order.order_num
AND prod_id = 'TNT2';
视图可以将整个上述查询的得到的结果包装成一个新的虚拟表productcustmers
SELECT cust_name, cust_contact
FROM productcustmers
WHERE prod_id = 'TNT2';
这就是SQL的视图,他不包含任何表包含的是一个SQL查询
为什么要使用视图?
- 重用SQL语句
- 简化复杂的SQL操作,编写查询以后可以方便的重用而不需要知道查询的具体细节
- 使用表的一部分而不是完整的表
- 保护数据,可以给用户授予部分表的使用权限而不用全部给用户
- 更改格式,视图可以返回与底层表不同的格式
注意:视图就是查询不包含数据,因此使用视图时就会有查询消耗,部署大量视图的时候要注意做测试
视图的规则和使用限制
- 与表格一样视图必须唯一命名
- 视图的创建数目没有限制
- 由数据库管理人员给与权限才可以使用视图创建
- 视图可以嵌套,类似查询子句嵌套
- ORDER BY可以使用,如果视图本身包含ORDER BY则新使用的将会覆盖原来的
- 视图不能索引也不能有关联的触发器或默认值
- 视图可以和一个表一起联结
创建视图
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;
创建一个名为productcustomers视图,联结三个表,用来返回订购了任意产品的所有客户的列表。如果执行SELECT * FROM productcustomers,将列出订购了任意产品的客户。
若想检索订购了TNT2的客户:
SELECT cust_name, cust_contact
FROM productcustomers
WHERE prod_id = 'TNT2';
用视图更改检索数据的格式
CREATE VIEW vendorlocations AS
SELECT (concat(RTRIM(vend_name), '(', RTRIM(vend_country), ')'))
AS vend_title
FROM vendors
ORDER BY vend_name;
此视图可以检索出以创建所有邮件标签的信息:
SELECT *
FROM endorlocations;
用视图过滤不想要的数据
视图对于应用普通的WHERE子句也很有用。例如:可以定义一个视图过滤掉没有电子邮件地址的客户
CREATE VIEW customeremaillist AS
SELECT cust_id, cust_name, cust_email
FROM customers
WHERE cust_email IS NOT NULL;
使用视图与计算字段
将原先的查询创建为视图,后续对查询的使用就很方便
CREATE VIEW orderitemsexpanded AS
SELECT order_num, prod_id, quantity, item_pricce, quantity * item_pricce AS expanded_price
FROM orderitems;
再检索订单2005的详细内容
SELECT *
FROM orderitemsexpanded
WHERE order_num = 20005;
总结
视图时虚拟的表,本质是查询。其提供了对查询的封装,简化数据处理过程以及重新格式化基础数据或保护基础数据