MySQL视图

提出问题

经常查询各个部门工资最高的人的信息,sql下:

select *
    from emp a,
         (select deptno b_deptno, max(sal) as max_sal
            from emp
           group by deptno) b
   where a.sal = b.max_sal

由于要经常查询,该sql语句又很长,频繁编写该sql语句,效率太低

分析

使用 View 视图解决

View 视图介绍

视图是一种 虚表。在物理上并不存在,也就是不占用磁盘空间

视图 建立 在 已有表 的基础上,可以简化 select 查询语句

为什么使用视图

  • 方便查询

  • 控制数据访问

    比如工资的信息不让其他人查询、修改,那么就就原表的访问权限仅限个别人查看,然后创建视图,该视图没有工资列,并将该视图的权限让所有人可访问

视图的操作

创建视图

create view 视图名 as
select 语句

创建或修改视图

如果没有该视图就创建,如果有该视图就修改

create or replace view 视图名 as
select 语句

例子:

create or replace view  emp_view  as 
    select empno,ename,job from emp

删除视图

drop view 视图名

删除视图不影响原表的数据

对视图中数据的增删改查

查询视图的数据

与查询表中数据的方式相同

修改视图的数据

与修改表中数据的方式相同

删除视图的数据

与删除表中数据的方式相同

创建视图时,不能有子查询

下面创建视图会 报错:

  create or replace view  emp_info  as
   select *
    from emp a,
         (select deptno b_deptno, max(sal) as max_sal
            from emp
           group by deptno) b
   where a.sal = b.max_sal

解决:
先将子查询创建视图:

create or replace view  deptno_maxsal  as 
   select deptno b_deptno, max(sal) as max_sal
            from emp
           group by deptno

然后再将 视图名 替换 子查询语句

create or replace view  emp_info  as
   select *
    from emp a,
         deptno_maxsal b
   where a.sal = b.max_sal

复杂视图 增删改 数据的限制

当视图包含以下元素之一时,不能执行insert语句:

  • 多行函数
  • group by
  • distinct
  • rownum
  • 列的定义为表达式
  • 表中 不允许为空 的 列 在视图定义中 未包括

当视图包含以下元素之一时,不能执行delete语句:

  • 多行函数
  • group by
  • distinct
  • rownum

当视图包含以下元素之一时,不能执行update语句:

  • 多行函数
  • group by
  • distinct
  • rownum
  • 列的定义为表达式

原文出处:/show_1EF4uyXlq2cV.html