欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > 在MySQL中使用视图

在MySQL中使用视图

2025/2/22 2:08:22 来源:https://blog.csdn.net/i_cant_qiao_chu/article/details/145245551  浏览:    关键词:在MySQL中使用视图

目录

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、小结

  1. 啥是视图?视图就是一个虚拟的表,它不包含数据,相当于是存好的查询语句,每次使用时将会动态的进行数据查询。
  2. 为啥需要视图?可以化繁为简,提高SQL代码重用率,减少工作量,满足特定的需求。
  3. 怎么用视图?CREATE VIEW name AS SELECT ...和 DROP VIEW。
  4. 视图名称必须唯一,可以嵌套视图,但是不支持索引。
  5. 视图有各种各样的用途,重点就是面对需求如何利用视图来简化工作。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词