视图小结
视图是虚拟的表,它不包含数据,它包含的是一个SQL查询。
为什么使用视图
重用SQL语句;
简化复杂的SQL操作;
使用表的一部分而不是整个表;
保护数据;
更改数据格式。
性能问题:
视图不包含数据,每次使用视图,都要处理执行查询时所需的任一个检索。所以当联结较多或视图嵌套时,可能性能下降厉害。
视图使用限制
唯一命名;
创建视图,必须有足够的访问权限;
视图可以嵌套;
order by可以用在视图中,但如果该视图的selete语句中也有,那么该视图中的order by将被覆盖;
视图和表可以一起使用,如联结表和视图的selete语句。
视图使用
创建:
create view
查看:
show create view [视图名]
删除:
drop view [视图名]
更新:
create or replace view(如果更新的视图不存在,创建;如果存在,则替换)
视图最常见的应用:
隐藏复杂的SQL
一次性编写基础的SQL,然后根据需要,多次使用。
例:3个表联结,返回所有用户订购产品的列表
create view productcustomers as //创建视图
selete cust_name,prod_id
from customers,orders,orderitems
where customers.cust_id=orders.cust_id and
orders.cust_num=orderitems.cust_num;//联结条件
使用视图:
例:减少订购了TNT2的客户
selete cust_name,prod_id
from productcustomers //直接使用视图
where prod_id='TNT2';
使用视图重新格式化检索出的数据
例:
selete concat(vend_name,'(',vend_country,')')
as vend_title
from vendors
order by vend_name;
如果经常使用以上格式,创建一个视图,根据需要直接使用,即:
create view vendlocations as
selete concat(vend_name,'(',vend_country,')') as vend_title
from vendors
order by vend_name;
使用:
selete *
from vendlocations;
过滤不想要的数据
例:排除没有email的客户
create view customeremail as
selete cust_id,cust_name,cust_email
from customers
where cust_email is not mull;
使用视图与计算字段
例:
create view orderitemsexpanded as
selete order_num,
prod_id,
quantity,
item_price,
quantity*item_price as expanded_price
from orderitems;
使用:检索某个订单中的物品
selete *
from orderitemsexpanded
where order_num=20005;
视图更新
一般,视图是可以更新的。更新视图将更新其基表;
当视图定义中有以下操作(分组、联结、子查询、并、聚集函数),则视图不能更新。
以上,视图最好用于查询,而不是更新。