日期:2014-05-16  浏览次数:20813 次

mysql视图的理解和使用

CREATE TABLE tb_x

(

? xid ? ? ? INT ? ? ? ? NOT NULL AUTO_INCREMENT ,

? xname ? ? VARCHAR(50) NOT NULL,

? xloaction VARCHAR(40) NOT NULL,

? PRIMARY KEY (xid) ?

?

)

?

CREATE TABLE tb_y

(

? yid ? ? ? INT ? ? ? ? NOT NULL AUTO_INCREMENT ,

? yname ? ? VARCHAR(50) NOT NULL,

? yloaction VARCHAR(40) NOT NULL, ?

? PRIMARY KEY (yid) ?

)

?

CREATE TABLE tb_z

(

? zid ? ? ? INT ? ? ? ? NOT NULL AUTO_INCREMENT ,

? zname ? ? VARCHAR(50) NOT NULL,

? zloaction VARCHAR(40) NOT NULL ?,

? ? PRIMARY KEY (zid) ?

)

?

INSERT INTO tb_x (xname,xloaction) VALUES ("xn1","xl1"),("xn2","xl2"),("xn3","xl3"),("xn4","xl4"),("xn5","xl5"),("xn6","xl6"),("xn7","xl7"),("m1","n1"),("cc1","yy1")

INSERT INTO tb_y (yname,yloaction) VALUES ("yn1","yl1"),("yn2","yl2"),("yn3","yl3"),("yn4","yl4"),("yn5","yl5"),("yn6","yl6"),("yn7","yl7"),("m1","n1"),("cc1","yy1")

INSERT INTO tb_z (zname,zloaction) VALUES ("zn1","zl1"),("zn2","zl2"),("zn3","zl3"),("zn4","zl4"),("zn5","zl5"),("zn6","zl6"),("zn7","zl7"),("m1","n1"),("cc1","yy1")

?

SELECT * FROM tb_x ;

SELECT * FROM tb_y ;

SELECT * FROM tb_z ;

?

?

SELECT tb_x.xid ,tb_y.yid, tb_z.zid FROM tb_x,tb_y,tb_z WHERE tb_x.xname = tb_y.yname AND tb_x.xname = tb_z.zname

SELECT * FROM tb_x,tb_y,tb_z WHERE tb_x.xname = tb_y.yname AND tb_x.xname = tb_z.zname

?

例如上面的例子中,

A要用的是最后一个语句SELECT * FROM tb_x,tb_y,tb_z WHERE tb_x.xname = tb_y.yname AND tb_x.xname = tb_z.zname 产生的数据,找出里面包含yy的行的数据。

B也要用到最后一个语句SELECT * FROM tb_x,tb_y,tb_z WHERE tb_x.xname = tb_y.yname AND tb_x.xname = tb_z.zname 产生的数据,找出里面包含m的行的数据。

C也来一个,同样要用的上面的语句的查询结果,是不是一件很麻烦的事情。(自己多添加三个表一样的数据)

?

这样就出现了虚拟的表,就叫视图。

?

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

?

?

为上面要使用视图

1.简化了SQL语句

2.重用SQL语句

3.使用表的组成部分而不是整个表

4.保护数据,可以给用户授予表的特定部分的访问权限而不是整个表的访问权限

5.更改数据格式和表示,视图可返回与底层表的表示和格式不同的数据

?

在视图创建之后,可用与表基本相同的方式的用他们的,可以视图执行SELECT语句,过滤,排序,将视图连接到其他视图或者是表中,甚至

可以添加和更新数据(有特定的限制)。

?

视图本身是不包含数据的,只是来查看存储在别处的数据的一种设施,因为他们返回的数据是从其他表中的检索出来的,在添加或者更改这些表中的数据时,视图将

返回改变过的数据

?

视图的一些规则

1.名字唯一

2.对于创建的视图数目是没有限制的

3.为了创建视图,必须具有足够的访问权限

4.视图是可以嵌套的,也就是可以利用从其他视图中检索数据的查询来构造一个视图

5.order by 可以用再视图中,但如果从该视图检索数据SELECT中也含有ORDER BY,那么视图中的ORDER BY将被覆盖

6.视图不能索引,也不能有关联的触发器或者是默认值

7.视图可以和表一起使用。

?

CREATE VIEW pros AS?

SELECT * FROM tb_x,tb_y,tb_z WHERE tb_x.xname = tb_y.yname AND tb_x.xname = tb_z.zname //创建视图

?

SHOW CREATE VIEW pros; //查看视图的语句

?

DROP VIEW pros //删除视图的语句

?

SELECT * FROM pros; //使用视图,就像一张表一样了

?

可以这么理解,将SELECT语句的查询结果封装成了视图,那么用户可以直接使用SELECT查询的结果了