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、导出计算列。

原文地址:https://www.cnblogs.com/television/p/8360159.html