数据库操作:视图

青春壹個敷衍的年華 提交于 2020-03-08 17:20:43

 视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。

SELECT cust_name,cust_contact
FROM customers,orders,orderitems
WHERE customers.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查询。

视图可以重用SQL语句,简化复杂的SQL操作,使用表的组成部分而不是整个表。

重要的是知道视图仅仅是用来查看存储在别处的数据的一种设施。视图本身不包含数据,因此它们返回的数据是从其他表中检索出来的。在添加或更改这些表中的数据时,视图将返回改变过的数据。

与表一样,视图必须唯一命名;视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造一个视图;ORDER BY可以用在视图中,但如果从该视图检索数据的SELECT语句中也含有ORDER BY,那么视图中的ORDER BY将被覆盖;视图不能索引;视图可以和表一起使用。

 

视图用CREATE VIEW语句来创建。

使用SHOW CREATE VIEW viewname;来查看创建视图的语句。

用DROP删除视图,其语法为DROP VIEW viewname; 。

更新视图时,可以先用DROP再用CREATE,也可以直接用CREATE OR REPLACE VIEW

 

视图最常用的应用之一是隐藏复杂的SQL,这通常会涉及联结。

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 productcustomers
WHERE prod_id='TNT2';

视图的另一常见用途是重新格式化检索出的数据

SELECT Concat(RTrim(vend_name),'(',RTrim(vend_country),')')
AS vend_title
FROM vendors
ORDER BY vend_name;

假如经常需要这个格式的结果,不必在每次需要时执行联结,创建一个视图,每次需要时使用它即可。

CREATE VIEW vendorlocations AS
SELECT Concat(RTrim(vend_name),'(',RTrim(vend_country),')')
AS vend_title
FROM vendors
ORDER BY vend_name;

 

通常,视图是可更新的,更新一个视图将更新其基表(视图本身没有数据)。如果对视图增加或删除行,实际上是对其基表增加或删除行。

如果视图定义中有以下操作,则不能进行视图的更新:

分组(ORDER BY、HAVING):联结;子查询;并;聚集函数(MIN()、Count()等);DISTINCT;导出(计算)列。

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!