mysql/mariadb知识点总结 之 视图管理语句
Posted 小茗,你好
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql/mariadb知识点总结 之 视图管理语句相关的知识,希望对你有一定的参考价值。
目录
视图的概念
视图是一个”虚表”,用大白话说,就是从已经存在的表的全部字段或数据中,挑选出来一部分字段或数据,组成另一张”并不存在的表”,这张虚表被称之”视图”,视图中的字段与对应的数据均来自已经存在的表,对于视图来说,这些已经存在的表就被称为”基表”,基表可以是一张表,也可以是多张表, 视图的本质可以理解为一条查询语句,视图中显示的结果,就是这条查询语句查询出的结果。
使用视图的作用:
这个时候我们可能会有一个问题,既然视图中的字段均来自”基表”,为什么还要使用”视图”,我们直接使用”基表”就行了,干嘛还要用视图,这是有原因的,我们可以从以下几个方面理解。
1. 简化操作
我们说过,视图中的数据可能来自于多张基表,如果基表有很多,而且基表之间存在复杂的关系,当我们需要找出某些数据时,可能需要执行一条复杂的sql语句,如果我们把这个复杂的sql语句创建为视图,我们就可以直接从视图的结果中使用简单的sql语句查询出需要的结果,这使我们容易理解和使用。
2. 安全原因
安全原因往往是使用视图的主要原因,我们能通过视图,限制用户能够查看到的数据,比如我们创建了一张”供货商信息表”,这张表里面存放了公司20个大区所有供货商的数据,如果我授权了数据库用户A对这张表有查看权限,那么A用户将有权利查看”供货商信息表”中所有供货商的信息,如果想要限制A用户,让其只能查看前三个大区的供货商信息,我们就可以使用视图,将前三个大区中的供货商信息查询出来,将对应sql语句创建成”前三大区供货商视图”,然后授权A用户只能查看”前三大区供货商视图”,但是不能查看”供货商信息表”,那么数据库用户A则只能查看到前三个大区供货商的信息了,而不是能够看到所有供货商的信息,这就是我们之前所说的,视图是一张虚表,它的字段或者数据可能只是其他表中的一部分。
不使用视图的理由:
mysql对于视图的优化并不完善,这样说并不准确,准确的说,应该是mysql对于子查询的优化不是很好,而使用视图本身往往就意味着使用子查询,所以,如果我们必须使用视图时,最好将视图中的sql语句尽量优化,或者说,数据量大的时候尽量避免使用视图。
创建视图
在创建视图之前,请先确定当前登录的数据库用户是否拥有创建视图的权限。
select create_view_priv,select_priv from mysql.user where user='root' and host='localhost';
查询结果中,create_view_priv的值为Y,表示当前用户拥有创建视图的权利。
我们来创建一个最简单的视图:
create view view_demo as select * from student where suid <= 2;
我们可以把上图中创建视图的语句分成两个部分来看:
create view view_demo as 当做第一部分,这部分语句实现的功能就是创建一个名叫view_demo的视图,这个视图中的内容从as 后面的查询语句中获得。
select * from student where suid <= 2 为上图中语句的第二部分,这部分语句的功能就是从student表中查询出了suid号小于等于2的数据。
这两个部分结合在一起,就表示,我们将查询语句查询出的结果创建为一个名叫view_demo的视图。
注意:视图是一种”虚表”,所以不能与已经存在的表重名。
可以看到,即使我们查询出了view_demo视图中的所有信息,也只有2条数据,这2条数据都来自于student表,还记得我们在概念中提到的”安全原因”吗,这种场景就跟”安全原因”中提到的场景相同。
我们也可以使用如下语句创建视图
create or replace view view_demo as select * from student where suid <= 2;
create or replace view view_demo as 表示,如果view_demo这个视图如果不存在,那么则按照指定的查询语句创建视图,如果当下已经存在view_demo这个视图,那么则使用当前视图覆盖之前的视图,以当前的sql查询语句作为视图的语句。
视图创建后,视图中的字段名与”基表”中的字段名称相同,我们也可以让视图使用自己的字段名,而不是使用基表中的字段名称,我们可以在创建视图时使用如下语句。
删除视图
删除视图很简单,使用如下语句删除demo_view视图
drop view view_demo;
如下语句表示如果视图demo_view存在,则删除;
drop view if exists demo_view;
查看视图
我们可以查看数据库中存在哪些视图,也可以查看视图的结构,还可以查看视图中的内容,我们一个一个来。
首先,如果我们想要查看某一数据库中的所有视图,可以使用如下语句查看:
select * from information_schema.views where table_schema=’mysql’\\G
示例如下:
我们也可以查看视图的结构,就像查看表的结构一样;
desc view_demo;
我们也可以查看视图中的数据内容,就像查看表一样;
select * from view_demo;
修改视图
alter view view_demo as select suid,sname,sgender from student;
以上是关于mysql/mariadb知识点总结 之 视图管理语句的主要内容,如果未能解决你的问题,请参考以下文章
mysql/mariadb知识点总结 之 数据库变量(参数)管理