【MySQL】视图

视图

  • 一、基本使用
  • 二、视图与基表的相互影响
    • 1、修改视图影响基表
    • 2、修改基表影响视图
    • 三、删除视图

      视图的概念:

      视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。


      准备工作,准备测试表:

      下面用员工表和部门表作为测试表,员工表中的ename代表的是员工的姓名,deptno代表的是员工所在部门的部门号。如下:

      部门表中的dname代表的是部门名,deptno代表的是部门的部门号。如下:

      一、基本使用

      语法:创建视图

      create view 视图名 as select语句;
      

      说明:

      • 创建视图时会先执行select语句,然后用查询得到的结果来创建视图。

        例如下面的一个场景,当我们要查询每个员工及其对应的部门名称时,需要使用员工表和部门表进行多表查询,并筛选出员工的部门号等于部门的部门号的记录。如下:

        select ename, dname from emp inner join dept on emp.deptno=dept.deptno;
        

        如果该查询结果会被频繁用到,那我们就可以给上述查询结果创建视图,这样我们以后就可以直接访问该视图,而不用每次都先对表进行内连接,然后进行筛选。

        create view v_ename_dname as select ename, dname from emp inner join dept on emp.deptno=dept.deptno;
        

        然后我们可以通过show tables命令就能看到这个视图。如下:

        此外,我们知道当我们每创建一张表时,在mysql的默认存储位置中都会新增一个xxx.frm和xxx.ibd文件(对于innodb存储引擎)。

        然后我们去查看我们新增的v_ename_dname表的存储文件:

        我们发现有一个对应的frm文件(存储表的结构),但并没有与之对应的ibd文件(存储表中的数据),这证明了视图和基表使用的是同一份数据。

        创建了这张v_ename_dname视图后,我们就可以直接通过查询视图,来查看每个员工及其对应的部门名称了。如下:

        select * from v_ename_dname;
        

        二、视图与基表的相互影响

        1、修改视图影响基表

        例如下面我们要在视图中修改员工SMITH的名称为小写:

        update v_ename_dname set ename='smith' where ename='SMITH';
        

        然后我们现在去emp表中查看这个更改是否生效了。

        select * from emp;
        

        确实生效了,说明修改视图会影响基表!

        2、修改基表影响视图

        参看部门表:

        假设我们现在要将accounting部门改为HR部门。

        update dept set dname='HR' where deptno=10;
        

        然后我们查看视图v_ename_dname:

        发现视图中的数据被改变了!说明修改基表会影响视图。

        三、删除视图

        删除视图的SQL如下:

        DROP VIEW view_name;
        

        比如将刚才创建的视图删除后,在数据库中就看不到这个视图了。如下:

        并且该视图在数据库目录下对应的xxx.frm文件也会被删除。

        • 与普通表一样,视图的命名也必须是唯一的,不能出现同名视图或表名。
        • 创建视图的数目无限制,但要考虑复杂查询创建为视图之后的性能影响。
        • 视图不能添加索引,也不能有关联的触发器或者默认值。
        • 视图可以提高安全性,在访问视图时必须具有足够的访问权限。
        • 创建视图时可以使用order by子句,但如果从该视图检索数据时也含有order by子句,那么该视图中的order by将被覆盖。
        • 视图可以和普通表一起使用,比如进行多表查询,内外连接等。