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查询的结果了