视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。
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;导出(计算)列。
来源:CSDN
作者:Reverse train.
链接:https://blog.csdn.net/xylyaya/article/details/104732248