目录
1、视图
(1)什么是视图
(2)为什么使用视图
(3)视图的规则和限制
2、创建视图
(1)利用视图简化复杂的联结
(2)用视图重新格式化数据
(3)用视图过滤不想要的数据
(4)使用视图与计算字段
3、小结
博主用的是mysql8 DBMS,附上示例资料:
百度网盘链接: https://pan.baidu.com/s/1XaWi3Y7hpXbs_uHq2cPI6Q
提取码: fpnx
1、视图
(1)什么是视图
视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。
理解这句话:先看一个查询例子:
-- 查询用来检索订购了ANV01产品的顾客。
SELECT cust_name, cust_contact
FROM Customers INNER JOIN Orders INNER JOIN OrderItems
ON Customers.cust_id = Orders.cust_id AND OrderItems.order_num = Orders.order_num
WHERE prod_id = 'ANV01';
该查询可以查找到订购了产品号为 ANV01 的产品的顾客。
假设,一段时间后,这个需求依旧存在,我又想要查找 prod_id = 'ANV03' 的顾客,岂不是还需要重写该SQL语句?
视图的作用就是:把整个查询包装成一个唯一的虚拟表,则可以如下轻松地检索出相同的数据。
-- 视图的作用就是将整个查询包装为一个名为 ProductCustomers 的虚拟表
-- 创建一个自然联结三表的视图
CREATE VIEW ProductCustomers AS
SELECT Customers.*, orders.order_num, orders.order_date,orderitems.order_item, orderitems.prod_id, orderitems.quantity, orderitems.item_price
FROM Customers INNER JOIN Orders INNER JOIN OrderItems
ON Customers.cust_id = Orders.cust_id AND OrderItems.order_num = Orders.order_num-- 查找订购了ANV03产品的顾客
-- 使用视图,视图是虚拟的,使用的时候会执行创建视图的查询语句。
SELECT cust_name, cust_contact
FROM ProductCustomers
WHERE prod_id = 'ANV03';
(2)为什么使用视图
使用视图可以达成如下作用:
- 重用 SQL 语句。
- 简化复杂的 SQL 操作。在编写查询后,可以方便地重用它而不必知道其基本查询细节。
- 使用表的一部分而不是整个表。
- 保护数据。可以授予用户访问表的特定部分的权限,而不是整个表的访问权限。
- 更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。
创建视图之后,可以用与表基本相同的方式使用它们。可以对视图执行SELECT 操作,过滤和排序数据,将视图联结到其他视图或表,甚至添加和更新数据(添加和更新数据存在某些限制,关于这个内容稍后做介绍)。
重要的是,要知道视图仅仅是用来查看存储在别处数据的一种设施。视图本身不包含数据,因此返回的数据是从其他表中检索出来的。在添加或更改这些表中的数据时,视图将返回改变过的数据。
注意:性能问题
因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时需要的所有检索。如果你用多个联结和过滤创建了复杂的视图或者嵌套了视图,性能可能会下降得很厉害。因此,在部署使用了大量视图的应用前,应该进行测试。
(3)视图的规则和限制
下面是关于视图创建和使用的一些最常见的规则和限制。
- 与表一样,视图必须唯一命名(不能给视图取与别的视图或表相同的名字)。
- 视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造视图。
- 有些 DBMS 要求对返回的所有列进行命名,如果列是计算字段,则需要使用别名.
- 视图不能索引,也不能有关联的触发器或默认值。
2、创建视图
视图用 CREATE VIEW 语句来创建。与 CREATE TABLE 一样,CREATE VIEW 只能用于创建不存在的视图。同样:删除视图:DROP VIEW name
(1)利用视图简化复杂的联结
像先前所说:想要查找 prod_id = 'ANV03' 的顾客,岂不是还需要重写SQL语句?那么可以利用视图来隐藏复杂的SQL语句,只使用过滤来找到我们需要的数据 。
-- 视图的作用就是将整个查询包装为一个名为 ProductCustomers 的虚拟表
-- 创建一个自然联结三表的视图
CREATE VIEW ProductCustomers AS
SELECT Customers.*, orders.order_num, orders.order_date,orderitems.order_item, orderitems.prod_id, orderitems.quantity, orderitems.item_price
FROM Customers INNER JOIN Orders INNER JOIN OrderItems
ON Customers.cust_id = Orders.cust_id AND OrderItems.order_num = Orders.order_num;-- 查找订购了ANV03产品的顾客
-- 使用视图,视图是虚拟的,使用的时候会执行创建视图的查询语句。
SELECT cust_name, cust_contact
FROM ProductCustomers
WHERE prod_id = 'ANV03';
-- ORDER BY prod_id; 是允许的
-- 它将指定的 WHERE 子句添加到视图查询中已有的 WHERE 子句中
(2)用视图重新格式化数据
视图的另一常见用途是重新格式化检索出的数据。下面的SELECT 语句在单个组合计算列中返回供应商名和位置:
-- 2、用视图重新格式化检索出的数据
SELECT CONCAT(RTRIM(vend_name), ' (', RTRIM(vend_country), ')' ) AS vend_title
FROM Vendors
ORDER BY vend_name;
现在,假设经常需要这个格式的结果。我们不必在每次需要时执行这种拼接,而是创建一个视图,使用它即可。把此语句转换为视图,可按如下进行:
CREATE VIEW VendorLocations AS
SELECT CONCAT(RTRIM(vend_name), ' (', RTRIM(vend_country), ')' ) AS vend_title
FROM Vendors;-- 直接检索视图就执行了格式化的语句
SELECT *
FROM VendorLocations;
(3)用视图过滤不想要的数据
视图对于应用普通的 WHERE 子句也很有用。例如,可以定义CustomerEMailList 视图,过滤没有电子邮件地址的顾客。为此,可使用下面的语句:
-- 3、用视图过滤不想要的数据
CREATE VIEW CustomerEMailList AS
SELECT cust_id, cust_name, cust_email
FROM Customers
WHERE cust_email IS NOT NULL;-- 使用视图来执行过滤的语句
SELECT *
FROM CustomerEMailList;
说明:WHERE 子句与 WHERE 子句
从视图检索数据时如果使用了一条 WHERE 子句,则两组子句(一组在视图中,另一组是传递给视图的)将自动组合。
(4)使用视图与计算字段
检索某个订单中的物品,计算每种物品的总价格。
SELECT prod_id, quantity, item_price, quantity*item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;
现在我想只用订单号就能查找到总价格呢?我不想取弄计算字段:
CREATE VIEW OrderItemsExpanded AS
SELECT order_num, prod_id, quantity, item_price, quantity*item_price AS expanded_price
FROM OrderItems;-- 使用视图,就可以随心查找指定的订单号了
SELECT *
FROM OrderItemsExpanded
WHERE order_num = 20007;
3、小结
- 啥是视图?视图就是一个虚拟的表,它不包含数据,相当于是存好的查询语句,每次使用时将会动态的进行数据查询。
- 为啥需要视图?可以化繁为简,提高SQL代码重用率,减少工作量,满足特定的需求。
- 怎么用视图?CREATE VIEW name AS SELECT ...和 DROP VIEW。
- 视图名称必须唯一,可以嵌套视图,但是不支持索引。
- 视图有各种各样的用途,重点就是面对需求如何利用视图来简化工作。