视图是虚拟的表,与包含数据的表不一样,视图值包含使用时动态检索数据的查询
MySQL 从5版本开始支持视图
SQLite 只支持读视图,不支持更改
视图提供了一种封装SELECT 语句的层次,可以用来简化数据处理,重新格式化或保护基础数据
我们先看一个SQL
SELECT cust_name,cust_contact
FROM Customers,Orders,OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItem.order_num = Orders.order_num
AND prod_id = 'RANG01';
这里查看用来检索订购了某种商品的顾客。
任何需要这个数据的人都必须理解相关的表结构,知道如何创建查询和对表进行联结检索其他产品的相同数据,必须修改最后的where子句
我们可以吧整个查询包装成一个名为ProductCustomers 的虚拟表,则可以轻松的检索出相同的数据
SELECT cust_name,cust_contact
FROM ProductCustomers
WHERE prod_id = 'RANG01';
ProductCustomers 是一个视图,他不包含任何列或数据,包含的是一个查询
- 重用SQL语句
- 简化复杂的SQL操作,在编写查询后,可以方便得重用他而不必知道其基本查询细节
- 使用表的一部分而不是整个表
- 保护数据。可以授予用户访问表的特定部分权限,而不是整个表的访问权限
- 更改数据格式和表示。视图可以返回与底层表的表示和格式不同的数据
创建视图之后,可以用与表的基本相同的方式使用他们。可以对视图执行SELECT 操作,过滤,排序数据。将视图联结到其他视图或表,甚至天天加班和更新数据
视图本身不包含数据,返回的数据来自其他表
因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时需要的所有检索。
如果你用多个联结和过滤创建了复杂的视图或者嵌套了视图,性能可能就会下降的厉害。
PS:部署前要进行测试
视图用CREATE VIEW 来创建
删除视图:DROP VIEW viewname;
重命名视图:必须先删除在重新创建
一个最常见的视图应用是隐藏复杂的SQL,这通常涉及联结
CREATE VIEW ProductCustomers AS
SELECT cust_name,cust_contact,prod_id
FROM Customer,Orders,OrderItems
WHERE Customer.cust-id= Orders.cust_id
AND OrderItems.order_num = Orders.order_num;
这条语句创建了一个名为ProductCustomers 的视图,联结了三个表,返回已订购了任意产品的所有顾客列表
检索订购了产品RANG01 的顾客
SELECT cust_name,cust_contact
FROM ProductCustomers
WHERE prod_id = 'RANG01';
CREATE VIEW VendorLocations AS
SELECT RTRIM(vend_name)+'('+RTRIM(vend_country)+')' AS vend_id
FROM Vendors;
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,
qquantity*item_price AS expanded_price
FROM OrderItems;