一、什么是视图
百度百科的解释是:
视图是一个虚拟表,视图并不在数据库中存储数据值,数据库中只在数据字典中存储对视图的定义。
这显然是不能让我们满意的。
数据库中的视图是一个虚拟表,同真实的表一样,视图包含一系列带有名称的行和列数据,行和列数据来自定义视图查询所引用的表,并且在引用视图时动态生成。视图是从一个或者多个表中导出的,视图的行为与表非常相似,但视图是一个虚拟表。在视图中用户可以使用
SELECT
语句查询数据,以及使用
INSERT、UPDATE和DELETE
修改记录。视图可以使用户操作方便,而且可以保障数据库系统的安全。当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化。同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。
视图是一个”虚表”,用大白话说,就是从已经存在的表的全部字段或数据中,挑选出来一部分字段或数据,组成另一张”并不存在的表”,这张虚表被称之”视图”。视图中的字段与对应的数据均来自已经存在的表。对于视图来说,这些已经存在的表就被称为”基表”。基表可以是一张表,也可以是多张表。视图的本质可以理解为一条查询语句,视图中显示的结果,就是这条查询语句查询出的结果。
上面这一段话来自另外的一个博主的文章,在下面给出了引用链接。他的最后一句话说是一条查询语句,其实是不妥当的,应该是增删改查的语句。
这篇文章中有一段话说得很好:
不使用视图的理由:
mysql对于视图的优化并不完善,这样说并不准确,准确的说,应该是mysql对于子查询的优化不是很好,而使用视图本身往往就意味着使用子查询,所以,如果我们必须使用视图时,最好将视图中的sql语句尽量优化,或者说,数据量大的时候尽量避免使用视图。
事实确实如此。在写本文之前,我这么多年工作中从未使用过视图,以至于都忘记视图是怎么创建使用的了。在银行的开发中,我所涉及的项目从未有使用过视图,因为在一般情况下,基本的SQL就可以满足了,为什么要使用视图呢?你说呢?我所了解的,在上海的这些银行中,比如,交行卡中心、交总行、交银金科、建行、建信金科、建信人寿,我是没有见到过视图的,而且也从未听说过哪一位同事使用了视图。除此之外,其他如中行、上海银行、浦发银行,我的了解也没有听在里面的同事朋友使用过。
好了,我们总结一下吧!
1、视图是一个虚拟表(逻辑表);
2、视图中的行和列的数据来自一到多张物理表,也可以来源自其他视图;
3、可以通过视图进行增删改查;
4、如果通过视图进行增删改,那么物理表的数据也会随之做出同样的增删改;反之亦然。
5、视图的使用比较少,起码相对于一般SQL来说,不在一个数量级上;
6、视图是一种”虚表”,所以不能与已经存在的表重名。
二、如何创建视图
在创建视图之前,请先确定当前登录的数据库用户是否拥有创建视图的权限。
select create_view_priv,select_priv from mysql.user where user='root' and host='localhost';
查询结果中,create_view_priv的值为Y,表示当前用户拥有创建视图的权利。
如果我们查询另外的用户:
select create_view_priv,select_priv from mysql.user where user='dake' and host='localhost';
说明 dake 这个用户是不具备创建视图的权限的。
下面我们说说如何创建视图。
1.创建视图
CREATE [OR REPLACE] [{FORCE|NOFORCE}] VIEW view_name
AS
SELECT查询
[WITH READ ONLY CONSTRAINT]
2.语法解析
OR REPLACE:如果视图已经存在,则替换旧视图。
FORCE:即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表创建成功后,视图才能正常使用。
NOFORCE:如果基表不存在,无法创建视图,该项是默认选项。
WITH READ ONLY:默认可以通过视图对基表执行增删改操作,但是有很多在基表上的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行insert操作),WITH READ ONLY说明视图是只读视图,不能通过该视图进行增删改操作。现实开发中,基本上不通过视图对表中的数据进行增删改操作。
接着,我们创建一个视图。
首先,给出我的基表—STUDENT表的数据:
然后,我们创建一个视图:
CREATE VIEW VU_STUDENT AS SELECT * FROM STUDENT WHERE ID > 2;
然后查看视图的情况,使用命令我们后续再讲。
查看视图的数据:
对比 STUDENT 这个基表,我们发现少了2行数据,这少的两行数据就是我们创建视图的时候的SQL中做了限制。
下面我们再看看视图的原生语句。
我把SQL贴出来:
CREATE
OR REPLACE
VIEW `VU_STUDENT` AS select
`STUDENT`.`ID` AS `ID`,
`STUDENT`.`NAME` AS `NAME`,
`STUDENT`.`GENDER` AS `GENDER`,
`STUDENT`.`AGE` AS `AGE`,
`STUDENT`.`CLASS_ID` AS `CLASS_ID`,
`STUDENT`.`ADDRESS` AS `ADDRESS`
from
`STUDENT`
where
`STUDENT`.`ID` > 2
我们看到,它自动增加了 OR REPLACE ,说明 Maria 创建视图时的默认设置。然后把 select * 自动变更为了需要查询的字段,这个是一般SQL的基本操作。
这里说一下视图的命名。视图的命名最好也是比较规范的写法是加上一定的前缀,当然后缀也可以,这个按照项目要求或者项目统一规范即可。
比如,我这里就是 VU_ 加上了表名,即 VU_STUDENT 。如果是两张表的话,可以是:
VU_表1的名字_表2的名字
这种方式,当然如果表名比较长,或者是多张表,你也可以使用这几张表的简写,或者根据你这个视图的业务逻辑来命名。
示例视图命令解读
上面我们创建的视图命令,可以分两部分来解读:
1、CREATE VIEW VU_STUDENT AS
2、SELECT * FROM STUDENT WHERE ID > 2;
其中第一部分表示我们要创建一个视图,视图名为 VU_STUDENT,第二部分表示该视图的业务逻辑。两部分结合起来就是一个完整的视图了。
上面我们创建的这个视图,得到的列名是和 STUDENT表是一样的,当然我们也可以自行定义列名。不过这个一般很少有人这么做,如果这么做是真的有点扯淡,闲得蛋疼了。不过事无绝对,如果你的视图要和另外的视图或表联合使用,而几张表中表示相同意义的字段名不一样,你使用的时候就有点麻烦。假设有表A和表B,两个表的某一个字段是一个意义,但是名字不一样。此时把你创建的这个视图(假设数据来源自表A)的这一列的列名,修改为和另一张表(表B)的这个列名相同,然后你的业务代码或SQL中对这个视图和表B的操作就方便很多了。
这个给视图字段起别名的做法就像我们建表时类似。
CREATE VIEW VU_STD (S_ID, S_NAME, S_GENDER, S_AGE, S_CLASS_ID, S_ADDRESS) AS SELECT * FROM STUDENT WHERE ID > 2;
此时如果我们查看数据以及列名的话会发现:
一目了然了吧!
我们创建这个视图非常简单,其实是因为我们的SQL业务逻辑简单,也就是 示例视图命令解读
2 中的SQL语句简单了。我们最开始说了,可以增删改查的,那么当然可以使用子查询、连接、分组等等SQL的操作,这个就看你自己的业务逻辑了骚年。
三、如何使用视图
1.视图查询操作
在 二 中我们说了,视图就是一张虚标,你把他当做表即可。
SELECT * FROM VU_STUDENT;
我们上面说了,视图可以增删改查,那么增删改怎么使用呢?
2.视图新增操作
我们使用视图增加一条记录到 STUDENT 表中:
CREATE VIEW VU_STD_DLT AS INSERT INTO STUDENT VALUES (14, '范冰冰', '01', 39, 5 , '上海浦东陆家嘴1124号');
结果呢?
报错了。是我们SQL有问题吗?
我们执行SQL插入的逻辑:
INSERT INTO STUDENT VALUES (14, '范冰冰', '01', 39, 5 , '上海浦东陆家嘴1124号');
结果呢?
insert 语句没问题啊!这是什么情况呢?是不是因为我们这个用户的原因呢?我们把登陆用户修改为root试试。
再新增一条语句:
CREATE VIEW VU_STD_DLT AS INSERT INTO STUDENT VALUES (15, '范蠡', '00', 50, 0 , '上海浦东陆家嘴1125号');
结果:
哈哈!错误是一样的。
3.视图删除操作
既然新增不行,那么我修改删除呢?我们先增加一条记录,然后执行删除:
INSERT INTO STUDENT VALUES (15, '范蠡', '00', 50, 0 , '上海浦东陆家嘴1125号');
视图删除:
CREATE VIEW VU_STD_DLT AS DELETE FROM STUDENT WHERE ID = 15;
删除报错:
4.视图修改操作
那么修改呢?估计也一样。
CREATE VIEW VU_STD_UPD AS UPDATE STUDENT SET ID = 16 WHERE ID = 15;
结果:
通过这几个操作我们得出了结论:
1、视图的查询操作,可以直接在客户端使用,但是增删改却是不行的;
2、视图和真实的物理表还是有一些区别的。
四、如何修改视图
ALTER VIEW VU_STUDENT AS SELECT * FROM STUDENT WHERE ID > 10;
然后查询视图的数据
SELECT * FROM VU_STUDENT;
其中第五行是我后面加上的。
可以看到修改视图很简单。
五、如何删除视图
DROP VIEW VU_STUDENT;
如果删除一个不存在的视图呢?
报错了,那么我们可以使用下面的命令避免这种情况:
DROP VIEW IF EXISTS VU_STUDENT;
这样就不会报错了。
六、如何查看视图
查看视图的结构:
DESC VU_STUDENT;
查看某数据库中所有的视图:
select * from information_schema.views where table_schema= 'study';
本文参考:
MariaDB 视图与触发器
mysql/mariadb知识点总结 之 视图管理语句
Oracle 视图详解(view)
版权归原作者 北冥牧之 所有, 如有侵权,请联系我们删除。