1.关于视图
-限制对数据库的访问
-容易实现复杂的查询
-对于相同的数据可以产生不同的视图
2.创建视图
1)在CREATE VIEW语句中嵌入一子查询
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias[,alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
例:创建视图empv,该属兔仅包含10部门雇员的细节信息。
CREATE VIEW empv
AS SELECT empno,ename,job
FROM emp
WHERE deptno=10;
查看:DESC empv
2)别名的使用
例1:CREATE OR REPLACE VIEW salv
AS SELECT empno EMPLOYEE_ID,ename NAME,sal SALARY
FROM emp
WHERE deptno=30;
例2:CREATE OR REPLACE VIEW salv
(EMPLOYEE_ID,NAME,SALARY)
AS SELECT empno,ename,sal
FROM emp
WHERE deptno=30;
3.创建复杂视图
例:创建一个基于两个表并且含有组函数的复杂视图
CREATE OR REPLACE VIEW dept_sum_v(name,minsal,maxsal,avgsal)
AS SELECT d.dname,MIN(e.sal),MAX(e.sal),AVG(e.sal)
FROM emp e,dept d
WHERE e.deptno=d.deptno
GROUP BY d.dname;
4.查看视图
数据字典USER_VIEWS
SELECT view_name,text
FROM user_views;
结果:
VIEW_NAME TEXT
SALV SELECT empno EMPLOYEE_ID,ename NAME,sal SALARY FROM emp WH
5.从视图检索数据
SELECT * FROM salv;
6.视图上执行DML操作
1)如果视图包含以下内容,则不能实现对数据的修改:
-GROUP函数、GROUP BY子句、DISTINCT关键字
-使用表达式定义的列
-ROWNUM伪列
2)如果视图中包含以下内容则不能删除数据行
-GROUP函数
-GROUP BY子句
-DISTINCT关键字
-ROWNUM伪列
7.WITH CHECK OPTION子句
-如果要确保在视图上执行的插入、更新操作仅限于一定的范围,便可使用WITH CHECK OPTION 子句
例:
CREATE OR REPLACE VIEW empv
AS SELECT *
FROM emp
WHERE deptno=20
WITH CHECK OPTION CONSTRAINT empv_ck;
测试一:update empv set deptno=10 where empno=7369
结果:
ERROR 位于第 1 行:
ORA-01402: 视图 WITH CHECK OPTIDN 违反 where 子句
测试二:update empv set sal=2000 where empno=7369
结果:已更新 1 行。
8.拒绝DML操作
-在视图定义时使用WITH READ ONLY选项可以确保不能对视图执行DML操作
例:
CREATE OR REPLACE VIEW empv(employee_ID,employ_name,job_title)
AS SELECT empno,ename,job
FROM emp
WHERE deptno=10
WITH READ ONLY;
9.删除视图
-删除视图并不会删除数据,因为视图是基于数据库中的基表
DROP VIEW view;
例:DROP VIEW empv;
10.小结
视图是基于一个或多个表或视图的逻辑表,它本身不包含数据,具有一下优点
-限制对数据库的访问
-简化查询
-维护数据的独立性
-对相同的数据可以建立不同的视图
-可以删除视图而不影响数据
练习
1.根据emp表来创建视图empv,选取ename、job、sal、deptno列,分别对应显示雇员名、工作类别、薪水、部门号
要求:只看到薪水小于1500的雇员信息
CREATE OR REPLACE VIEW empv
AS SELECT ename "雇员名",job "工作类别",sal "薪水",deptno "部门号"
FROM emp
WHERE sal<1500;
或:
CREATE OR REPLACE VIEW empv( "雇员名", "工作类别", "薪水","部门号")
AS SELECT ename,job,sal,deptno
FROM emp
WHERE sal<1500;
2.根据emp、dept表来创建视图dept_sum_v,显示empno、ename、job、sal、deptno、dname列信息
CREATE OR REPLACE VIEW dept_sum_v
AS SELECT empno,ename,job,sal,d.deptno,dname
FROM emp e,dept d
WHERE e.deptno=d.deptno;
3.创建视图empv,显示部门编号、雇员编号、雇员名字、薪水。
通过视图empv插入数据(10,1000,'小王',2000)
CREATE OR REPLACE VIEW empv("部门编号","雇员编号","雇员名字","薪水")
AS SELECT deptno,empno,ename,sal
FROM emp;
INSERT INTO empv
VALUES (10,1000,'小王',2000);
4.创建视图empv1,显示部门编号,雇员编号,雇员名字,薪水,年薪。
通过视图empv1插入数据(10,1000,'小王',2000,24000)
CREATE OR REPLACE VIEW empv1
("部门编号","雇员编号","雇员名字","薪水","年薪")
AS SELECT deptno,empno,ename,sal,sal*12
FROM emp;
INSERT INTO empv1
VALUES (10,1000,'小王',2000,24000);
结果:
INSERT INTO empv1
*
ERROR 位于第 1 行:
ORA-01733: 此处不允许虚拟列
5.创建视图empv2,显示部门编号,雇员名字,薪水,雇用日期
通过视图empv2插入数据(10,'小王',2000,'2007-8-1')
CREATE OR REPLACE VIEW empv2("部门编号","雇员名字","薪水","雇用日期")
AS SELECT deptno,ename,sal,hiredate
FROM emp;
INSERT INTO empv2
VALUES (10,'小王',2000,'2007-8-1');
结果:
VALUES (10,'小王',2000,'2007-8-1')
*
ERROR 位于第 2 行:
ORA-01861: 文字与格式字符串不匹配
6.创建视图empv3,显示empno,ename,deptno,dname,sal
通过视图empv3插入数据(1001,'小王',10,'开发部',2000)
CREATE OR REPLACE VIEW empv3
AS SELECT empno,ename,d.deptno,dname,sal
FROM emp e,dept d
WHERE e.deptno=d.deptno;
INSERT INTO empv3
VALUES (1001,'小王',10,'开发部',2000);
结果:
INSERT INTO empv3
*
ERROR 位于第 1 行:
ORA-01776: 无法通过连接视图修改多个基表
7.通过视图empv更新雇员编号是1000的雇员,薪水为2500
UPDATE empv
SET sal=2500
WHERE empno=1000;
8.创建视图empv3,根据部门分组显示部门编号、部门最大薪水、最少薪水
更新部门编号为10的部门,将最少的薪水增加500
CREATE OR REPLACE VIEW empv3
AS SELECT deptno,MAX(sal) maxsal,MIN(sal) minsal
FROM emp
GROUP BY deptno;
UPDATE empv3
SET minsal=minsal+500
WHERE deptno=10;
结果:
UPDATE empv3
*
ERROR 位于第 1 行:
ORA-01732: 此视图的数据操纵操作非法
9.查看所建立的视图
SELECT view_name,text
FROM user_views;
9.删除以上创建的所有视图
DROP VIEW dept_sum_v;
DROP VIEW empv;
DROP VIEW empv1;
DROP VIEW empv2;
DROP VIEW empv3;