以前大学的时候有学过数据库这门课,对视图两个字有点印象,感觉是一个比较难的一个东西,今天刚好跟到了《MySQL必知必会》这个书的第22章视图这一节,于是还是来学习下,在写这篇博文前,花了点时间看了下,反正没有怎么看懂,总是感觉视图这个东西怪怪的。但是我们还是得必须学习它嘛。
听从我们黄杉大师的建议,从这节开始我就不在黑窗口鼓捣了,借助于SQLyog工具来进行数据库的学习,效率可能要高点,这里对黄杉大师的建议表示感谢。下面是黄杉大师的博客地址:http://blog.csdn.net/mchdba;有兴趣的可以看看。
废话不多说了,下面我们开始学习视图这一章。
什么视图?
视图不是实实在在的表,它只是一个虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询。
可能看到上面这句话还不是怎么懂什么是视图,个人理解:视图不是表,是一个查询语句的别名。但是我们可以向操作表一样来操作视图
为方便理解视图,看下面这个例子:
在联结表那一节我们有如下的语句
select cust_name ,cust_tel from customers,orders,ordersitems where customers.cust_id=orders.cust_id and orders.order_id=ordersitems.order_id and ordersitems.content='apple';//查处订单内容中包括apple的客户信息。
如果我们现在想查 订单内容是egg的客户信息,如果没有视图,我们只能更改上面的where 子句的条件。可能如下:
select cust_name ,cust_tel from customers,orders,ordersitems where customers.cust_id=orders.cust_id and orders.order_id=ordersitems.order_id and ordersitems.content='aegg';//查处订单内容中包括egg的客户信息。
如果我们又想查其它产品的数据,可能还得继续修改,我相信对于这种修改,一是比较容易出错,二是比较繁琐。
有了视图,你就可以看到它在这种情况下所带来的好处了。
创建视图的语法为:create view viewName …;
为上面的例子创建一个视图,如下:
create view cust_informationView as (select cust_name,cust_tel,content from customers,orders,ordersitems where customers.cust_id=orders.cust_id and orders.order_id=ordersitem.order_id);//创建视图
创建如上的视图之后,如果我们想查看订单内容中包括apple中的客户信息,则用如下语句就可以完成:
select cust_name,cust_tel from cust_informationView where content='apple';
当我们需要想查看其它内容时,书写就方便了许多,只是需要上面语句的where条件就ok了。而不用每次都像最上面联结表查询语句那样写那么长的查询语句了。
这里我遇到的一个问题就是:
如果在创建视图的时候没有将content 加入到视图中,则使用
select cust_name,cust_tel from cust_informationView where content='apple';
而必须是下面这面创建视图(即加上content)才行:
从这个例子可以看出,使用视图有如下好处:
1、重用SQL语句。不需要每次都写非常长的查询语句。
2、简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必知道它的基本查询细节。
3、使用表的组成部分而不是整个表。
在视图创建之后,可以用与表基本相同的方式操作它们。可以对视图执行select操作,过滤和排序数据等等。
重要的是知道视图仅仅是用来查看存储在别处的数据的一种措施。视图本身不包含数据,因此它们返回的数据是从其他表中检索出来的。在添加啊或更改这些表中的数据时,视图将返回改变过的数据。
上面说了创建视图是用 create view语句来实现。而查看视图、删除视图,更新视图的语法如下:
1、使用 show create view viewName;来查看创建视图的语句。
2、使用drop 来删除视图,语法为drop view viewname;
3、要更新视图时,可以先用drop再用create,也可以直接用create or replace view。如果要更新的视图不存在,则第二条更新语句会创建一个视图。如果要更新的视图存在,则第二条语句更新语句会替换原有的视图。
关于视图基本就是以上这样的,总的来说就是为了简化操作,使复杂的查询语句 得以简化重用。