MySQL视图 作者:马育民 • 2020-02-03 22:45 • 阅读:10079 # 提出问题 经常查询各个部门工资最高的人的信息,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 - 列的定义为表达式 原文出处:http://malaoshi.top/show_1EF4uyXlq2cV.html