X Tutup
Skip to content

Latest commit

 

History

History
 
 

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

README.md

VIEW视图

1. 是什么

视图是虚拟的表,与包含数据的表不一样,视图值包含使用时动态检索数据的查询

MySQL 从5版本开始支持视图

SQLite 只支持读视图,不支持更改

视图提供了一种封装SELECT 语句的层次,可以用来简化数据处理,重新格式化或保护基础数据

1.1 使用背景

我们先看一个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子句

1.2 使用视图包装成虚拟表

我们可以吧整个查询包装成一个名为ProductCustomers 的虚拟表,则可以轻松的检索出相同的数据

SELECT cust_name,cust_contact
FROM ProductCustomers
WHERE prod_id = 'RANG01';

ProductCustomers 是一个视图,他不包含任何列或数据,包含的是一个查询

2. 为什么使用视图

  • 重用SQL语句
  • 简化复杂的SQL操作,在编写查询后,可以方便得重用他而不必知道其基本查询细节
  • 使用表的一部分而不是整个表
  • 保护数据。可以授予用户访问表的特定部分权限,而不是整个表的访问权限
  • 更改数据格式和表示。视图可以返回与底层表的表示和格式不同的数据

创建视图之后,可以用与表的基本相同的方式使用他们。可以对视图执行SELECT 操作,过滤,排序数据。将视图联结到其他视图或表,甚至天天加班和更新数据

视图本身不包含数据,返回的数据来自其他表

2.1 性能问题

因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时需要的所有检索。

如果你用多个联结和过滤创建了复杂的视图或者嵌套了视图,性能可能就会下降的厉害。

PS:部署前要进行测试

3. 创建视图

视图用CREATE VIEW 来创建

删除视图:DROP VIEW viewname;

重命名视图:必须先删除在重新创建

3.1 利用视图简化复杂的联结

一个最常见的视图应用是隐藏复杂的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';

3.2 用视图重新格式化检索出的数据

CREATE VIEW VendorLocations AS 
SELECT RTRIM(vend_name)+'('+RTRIM(vend_country)+')' AS vend_id
FROM Vendors;

3.3 使用视图过滤不想要的数据

CREATE VIEW CustomerEMailList AS 
SELECT cust_id,cust_name,cust_email
FROM Customers
WHERE cust_email IS NOT NULL;

3.4 使用视图与计算字段

CREATE VIEW OrderItemsExpanded AS 
SELECT order_num,
		prod_id,
		qquantity*item_price AS expanded_price
FROM OrderItems;
X Tutup