二10、使用视图函数
一、 视图索引
视图是虚拟的表。与包含数据的表不同,视图只包含使用时动态检索数据的查询。rem
例如:SELECT cust_name, cust_contact产品
FROM customers, orders, orderitemsit
WHERE customers.cust_id = orders.cust_idio
AND orderitems.order_num = order.order_numemail
AND prod_id = ‘TNT2’;基础
此查询用来检索订购了某个特定产品的用户。能够看到检索语句比较复杂,另外若是要检索其余产品的相同数据,必须修改最后的WHERE子句。权限
若是把整个查询包装成一个名为productcustomers的虚拟表,则能够以下轻松地检索出相同的数据:语法
SELECT cust_name, cust_contact
FROM productcustomers
WHERE prod_id = ‘TNT2’;
为何使用视图:
视图仅仅是用来查看存储在别处的数据的一种设施,视图自己不包含数据。
视图的规则和限制:
二、 使用视图
视图的建立:
(1)、利用视图简化复杂的联结
例如: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;
这条语句建立一个名为productcustomers的视图,它联结三个表,以返回订购了任意产品的全部客户的列表。若是执行SELECT * FROM productcustomers,将列出订购了任意产品的客户。
为了检索订购了产品TNT2的客户,可以下进行:
SELECT cust_name, cust_contact
FROM productcustomets
WHERE prod_id = ‘TNT2’;
能够看到,视图极大地简化了复杂SQL语句的使用。利用视图,可一次性编写基础的SQL,而后根据须要屡次使用。
(2)、用视图从新格式化检索出的数据
下面的SELECT语句在单个组合计算列中返回供应商名和位置:
SELECT Contact(RTrim(vend_name), ’ (‘, RTrim(vend_country), ‘)’)
AS vend_title
FROM vendors
ORDER BY vend_name;
把此语句转换为视图,可按以下进 行:
CREAT VIEW vendorlocations AS
SELECT Contact(RTrim(vend_name), ’ (‘, RTrim(vend_country), ‘)’)
AS vend_title
FROM vendors
ORDER BY vend_name;
(3)、用视图过滤不想要的数据
视图对于应用普通的WHERE子句也颇有用。例如,能够定义customeremaillist视图,过滤没有电子邮件的客户:
CREATE VIEW customeremaillist AS
SELECT cust_id, cust_name, cust_email
FROM customers
WHERE cust_eamil IS NOT NULL;
(4)、使用视图与计算字段
视图对于简化计算字段的使用特别有用。
例如:检索某个特定订单中的物品,计算每种物品的总价格:
SELECT prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM orderitems
WHERE order_num = 20005;
将其转换为一个视图:
CREATE VIEW orderitemsexpanded AS
SELECT order_num,
prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM orderitems;
(5)、更新视图
视图的数据可否更新要视状况而定。
一般视图是能够更新的(即,能够对他们使用INSERT、UPDATE和DELETE)。更新一个视图将更新其基表。若是对视图增长或删除行,其实是对基表增长或删除行。
可是,并不是全部视图都是可更新的。若是MySQL不能正确地肯定被更新的基数据,则不容许更新。若是视图定义如下操做,则不能进行视图的更新: