mysql-视图
一、介绍
视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索的查询。如下:我们曾经使用的复杂查询:
select cust_name,cust_contact from customers,orders,orderitems where custmers.cust_id=orders.cust_id and orderitems.order_num=orders.order_num and prod_id='TNT2';
以上查询用来检索订购了某个特定产品的客户,现在我们可以吧整个外键关联的条件虚拟成一个productcustomers的虚拟表
select cust_name,cust_contact from productcustomers where prod_id='TNT2';
其中productcustomers是一个视图,它只是SQL查询,不包括任何数据。
二、为什么使用视图
1、重用SQL语句。
2、简化复杂的sql操作,在编写查询后,可以方便的重用它而不必知道他的基本查询细节。
3、使用表的组成部分,而不是整个表。
4、保护数据,可以给用户授予表的特定部分的访问权限而不是整个表的访问权限。
5、更改数据格式和表示,视图可返回与底层表的表示和格式不同的数据。
视图会影响性能,因此使用大量视图时候需要谨慎。
三、使用视图
1、视图用create view语句创建。
2、使用show create view viewname来查看创建视图的语句。
3、用drop view viewname;删除视图。
4、更新视图时,可以先用drop再用create,也可以直接用create or replace view进行替换更新
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;
针对上面的视图,我们只需要使用select * from productcustomers将自动列出订购了任意产品的客户。
2、用视图重新格式化检索出的数据。
使用视图可以重新格式化检索出的数据。如下:
create view vendorlocations as select concat(rtrim(vend_name),'(',rtrim(vend_country),')') as vend_title from vendors order by vend_name;
以上语句通过字段链接重新格式化了输出数据。
3、用视图过滤不想要的数据
我们可以使用视图过滤掉一些无用数据,比如没哟电子邮件的用户,如下:
4、使用视图与计算字段,如下:
为检索订单20005的详细信息,如下:
select * from orderitemsexpanded where order_num=20005;
四、更新视图
至今为止,我们所建立的所有思路都是和select语句使用的,通常视图时可更新的,也就是对视图使用insert,update,delete,更新一个视图实际上是更新其基表,实际上是对其基表进行增删改
但是MYSQL规定如果它本身并不能确认被更新的基数据,则不允许更新,如下都是不能确定基数据的方式:
1、分组
2、连接
3、子查询
4、并
5、聚集函数
6、distinct
7、导出计算列。