0


数据库的视图

一、什么是视图

百度百科的解释是:

视图是一个虚拟表,视图并不在数据库中存储数据值,数据库中只在数据字典中存储对视图的定义。

这显然是不能让我们满意的。

数据库中的视图是一个虚拟表,同真实的表一样,视图包含一系列带有名称的行和列数据,行和列数据来自定义视图查询所引用的表,并且在引用视图时动态生成。视图是从一个或者多个表中导出的,视图的行为与表非常相似,但视图是一个虚拟表。在视图中用户可以使用

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.语法解析

  1. OR REPLACE:如果视图已经存在,则替换旧视图。

  2. FORCE:即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表创建成功后,视图才能正常使用。

  3. NOFORCE:如果基表不存在,无法创建视图,该项是默认选项。

  4. 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)

标签: mariadb 数据库

本文转载自: https://blog.csdn.net/qq_42971035/article/details/124176872
版权归原作者 北冥牧之 所有, 如有侵权,请联系我们删除。

“数据库的视图”的评论:

还没有评论