《SQL必知必会》(18):视图

本文介绍了SQL中的视图概念,视图是一个虚拟表,用于简化复杂的SQL操作,重用查询语句,保护数据并改变数据表示。通过创建视图,可以隐藏复杂的联结,过滤不需要的数据,并在检索时重新格式化。视图虽然不包含数据,但能随着底层表的变化而更新。创建和删除视图的语法也进行了说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上回说到:《SQL必知必会》(17):创建和操纵表

第十八课:使用视图

18.1 视图

视图是虚拟的表,举个栗子:

SELECT
	cust_name,
	cust_contact 
FROM
	Customers,
	Orders,
	OrderItems 
WHERE
	Customers.cust_id = Orders.cust_id 
	AND OrderItems.order_num = Orders.order_num 
	AND prod_id = 'RGAN01'

如果我们将以上查询封装成一个ProductCustomers表(虚拟的。并不是真实的表),再次查询的操作就变为:

select
	cust_name,
	cust_contact
from
	ProductCustomers
where 
	prod_id = 'RGAN01'

相比于上边,简化了很多。
视图,他不包含任何的数据,只是包含查询

18.1.1 为什么使用视图

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

创建视图之后,使用起来跟正常的表无异。也可以将视图联结到其他的视图或表,甚至添加和更新数据。

因为视图本身不包含数据,只是存储了查询的语句,所以当其他表修改时,视图返回的是修改后的数据。视图只是简化了我们写SQL的操作,SQL的执行效率上不会有所变化。

18.1.2 视图的规则和限制

  • 与表一样,命名要唯一。
  • 对于可创建的视图的数目 没有限制。
  • 创建视图 要有足够的权限。
  • 视图可以嵌套,但是会极大的降低性能,所以尽量避免。
  • 有些DBMS禁止在视图使用order by,MySQL可以。
  • 视图不能索引,也不能关联触发器。
  • 有些DBMS,将视图作为只读,MySQL可以增删改。

18.2 创建视图

create view来创建,跟create table一样;
删除视图就是用 drop view viewname

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

视图最常见的应用就是隐藏复杂的SQL,通常涉及到联结。例:

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

这条SQL语句 创建了一个ProductCustomers 视图,联结了三个表。返回已订购了任意产品的所有顾客的列表。
如果执行select * from ProductCustomers ;将列出订购了任意产品的顾客。

检索定购了产品’RGAN01’ 的顾客,可如下进行:

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

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

在这里插入图片描述
新建视图,只需要加 create view VendorsLocations as

18.2.3 用视图过滤不想要的数据

视图对普通的where子句 也有用,如,可以定义CustomerEmainList视图,过滤没有电子邮件地址的顾客。

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

这样就可以直接发邮件了。

18.2.4 使用视图与计算字段

在简化计算字段的使用上,视图也特别有用。如,检索有个订单中的物品,计算每种物品的总价格。

SELECT
	prod_id,
	quantity,
	item_price,
	quantity * item_price AS expanded_price 
FROM
	OrderItems 
WHERE
	order_num = 20008

在这里插入图片描述
视图的创建很简单,也很好用。正确使用,可以极大的简化复杂数据的处理。

18.3 小结

视图 是 虚表。包含的不是数据,而是根据需要检索数据的查询。视图提供了一种封装SELECT语句的层次,可用来简化数据处理,重新格式化或保护基础数据
确实能保护数据,如,在一张表中,存储着所有的进价和售价,如果要展示给客户看,那么进价肯定是不能显示的,我们可以将需要显示的列,封装成一个视图。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bruce.vvu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值