上回说到:《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语句的层次,可用来简化数据处理,重新格式化或保护基础数据
。
确实能保护数据,如,在一张表中,存储着所有的进价和售价,如果要展示给客户看,那么进价肯定是不能显示的,我们可以将需要显示的列,封装成一个视图。