视图VIEW
– 含义:是虚拟的表,不包含任何数据,只包含使用时动态检索数据的查询,仅仅用来查看数据,其他表数据变化后,视图的查询重新检索,返回新的数据
– 作用:简化操作,编写查询后可以建为视图,方便的重用而不必知道基本查询细节;保护数据
– 使用:创建视图后,可以用与表相同的操作,就像真表一样
– 性能:每次使用视图时,都重新进行视图包含的这个查询。因此复杂视图、嵌套视图性能下降很厉害。
– 规则:视图必须唯一命名;确保有权限;禁止ORDER BY;对返回的所有列进行命名;不能索引,不能关联触发器和默认值
1. 创建视图
CREATE VIEW,不能覆盖
-- 查询订购了产品的顾客(内连接,不含空值),创建这个查询的视图
CREATE VIEW ProductsCustomers AS -- 创建了一个视图
SELECT cust_name,cust_contact,prod_id -- 完全正常的可独立执行的SELECT语句
FROM Customers,OrderItems,Orders
WHERE Customers.cust_id=Orders.cust_id
AND OrderItems.order_num=Orders.order_num;
-- 从视图中查询订购了产品RGAN01的顾客
SELECT cust_name,cust_contact
FROM ProductsCustomers
WHERE prod_id='RGAN01'; -- DBMS执行时将此WHERE子句添加到视图定义的查询的WHERE子句后面
– 创建这种没有特定条件的总数据的视图使得视图重用性增加
2. 删除视图
DROP VIEW viewname
修改视图必须删除原视图再重新创建。
– 经常需要某个计算字段时,不必每次都写计算过程,而是建立视图直接使用,本质上DBMS还是每次都计算,只是我们不用每次都写了
-- 将供应商和国家拼接为一个字段返回,创建这个查询的视图
CREATE VIEW VendorsLocation AS
SELECT RTRIM(vend_name)+'('+RTRIM(vend_country)+')'
AS vend_title
FROM Vendors;
SELECT * FROM VendorsLocation;
-- 查询订单中的物品,并计算每种物品的总价格,创建这个查询的视图(这样每次查询订单时就不用自己写计算字段了)
CREATE VIEW OrderItemsExpanded AS
SELECT order_num,prod_id,quantity,item_price,quantity*item_price AS expanded_price
FROM OrderItems
-- 查询20008订单的内容
SELECT *
FROM OrderItemsExpanded
WHERE order_num=20008;
– 当我们经常只想要表的某部分数据时,可对这部分数据创建视图,某种程度上保护了数据
-- 查询有电子邮件的顾客,创建这个查询的视图
CREATE VIEW CustomerEmailList AS
SELECT cust_id,cust_name,cust_email
FROM Customers
WHERE cust_email IS NOT NULL;
SELECT * FROM CustomerEmailList
WHERE cust_name='Fun4ALL'; -- 传递给视图的WHERE会自动组合到视图定义中,总之像正常表一样用就好啦
– CONCLUDE: 视图本质上就是查询,只不过包装了人们常用的查询,让我们编写代码进行后续多次这种查询时更方便而已。
– 简言之,封装SELECT语句,以简化数据处理或保护基础数据