提出问题
经常查询各个部门工资最高的人的信息,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
- 列的定义为表达式