本文主要介绍MySQL中的视图, 在什么情况下使用视图。
I、视图介绍
1.1 视图的初步理解
视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询。
我们以一个例子来说明使用视图的场景:
假如我们需要从3个表中找出某个特定的数据
# 不能扩展的查询方法
> 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';
上面的例子用于检索订购了某个特定产品的客户。任何需要这个数据的人必须理解相关表的结构,并且知道如何查询和对表进行联结。为了检索其他产品的相同数据,必须修改最后的WHERE
子句。
假如可以将整个查询包装成一个名为productcustomers的虚拟表,则可以如下轻松的检索出数据:
# 假设使用虚拟表
> SELECT cust_name, cust_contact
FROM productcustomers
WHERE prod_id = 'TNT2';
这就是视图的作用。productcustomers是一个视图,作为视图,它不包含表中应该由的任何列或数据,它包含的是一个SQL查询。
1.2 为什么使用视图
下面是一些视图的常见应用:
1、重用SQL语句;
2、简化复杂的SQL操作。在编写查询后,可以方便的重用它而不必知道它的基本查询细节;
3、使用表的组成部分而不是整个表;
4、保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限;
5、更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。
在视图创建之后,可以用与表基本相通的方式利用它们。
1.3 视图的规则和限制
1、视图可以嵌套,可以利用从其他视图中检索数据的查询来构造一个视图;
2、ORDER BY
可以用在视图中,但如果从该视图检索数据的SELECT
语句中也包含ORDER BY
,则该视图中的ORDER BY
将被覆盖;
3、视图不能索引,也不能有关联的触发器和默认值;
4、视图可以和表一起使用。
II、使用视图
1、使用CREAT VIEW
语句创建视图;
2、使用SHOE CREATE VIEW viewname
来查看创建视图的语句;
3、使用DROP
删除视图,DROP VIEW viewname
;
4、更新视图时,可以先用DROP
再用CREATE
,也可以直接用CREATE OR REPLACE VIEW
。如果要更新的视图不存在,则第2条更新语句会创建一个视图;如果要更新的视图存在,则第2条更新语句会替换原有视图。
2.1 使用视图简化复杂的联结
我们一般首先创建视图完成表的联结,然后就可以服用这个联结:
# CREATE VIEW
> CREATE VIEW productcustomer 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
语句:
# 使用视图
> SELECT cust_name, cust_contact
FROM productcustomer
WHERE prod_id = 'TNT2';
可以看出,视图极大地简化了复杂SQL语句的使用。利用视图,可以一次性编写基础的SQL,然后根据需要多次使用。
2.2 更新视图
1、通常情况下,视图是可以更新的,更新一个视图将更新其基表。
2、但是,并非所有的视图都是可更新的。基本上可以这样说,如果MySQL不能正确地确定被更新的基数据,则不允许更新。这实际上意味着,如果视图定义中有以下操作,则不能进行视图的更新:
· 分组(使用GROUP BY
和HAVING
);
· 联结;
· 子查询;
· 并;
· 聚集函数(Min, Count,Sum等);
· DISTINCT;
所以,一般情况下,我们应该只将视图用于检索(SELECT
),而不用于更新(INSERT
,UPDATE
,DELETE
)。
2.3 例题
牛客网_CREAE VIEW 例题1
【参考】
[1] 《MySQL必知必会》