Select * from v1;
查找user_views取出v1视图的定义。
select deptno,min(sal) salary from emp group by deptno;
数据库执行查找到的定义
所以说视图下降数据库的性能,尤其在复杂的视图相互关联查询的时候,你觉得语法很简单,其实视图
内调用了大量的表,容易使我们麻痹大意。
Force强制建立视图,视图使存在于数据字典中的定义,那么就可以先存在定义,再有基表。
先存在视图的定义,再建立基本表得使用强制的语法。
Drop table t2 purge;
Create force view v2 as select * from t2;
Create table t2 as select * from emp;
查看状态为INVALID
select object_name,object_type,status from user_objects;
调用视图后再查看状态为VALID
Select * from v2;
select object_name,object_type,status from user_objects;
修改视图
Create or replace view v1 as select * from dept;
就是将视图的定义替换。
删除视图
Drop view v1;
在数据字典中将视图的定义清除
不影响基本表中的数据
视图上运行DML
简单的视图可以运行dml
等于直接操作基本表的数据
但受到一些限制
Delete的限制
1.有组函数
2.有group by 子句
3.用了distinct关键字
4.有rownum列
Delete v1 where deptno=10;
ORA-01732: 此视图的数据操纵操作非法
Update的限制
1.有组函数
2.有group by 子句
3.用了distinct关键字
4.有rownum列
5.有表达式的列
insert的限制
1.有组函数
2.有group by 子句
3.用了distinct关键字
4.有rownum列
5.有表达式的列
6.基本表中有not null的列,但该列没有出现在视图的定义里
WITH CHECK OPTION选项
CREATE OR REPLACE VIEW empvu20
AS SELECT *
FROM emp
WHERE deptno = 20
WITH CHECK OPTION CONSTRAINT empvu20_ck ;
建立视图的时候带有检测约束,约束就是where的条件。确保在update视图的时候,视图所选择的行不会发生变化,是对视图中数据的一种保障。
update empvu20 set deptno=10;
ORA-01402: 视图 WITH CHECK OPTIDN where 子句违规
Read only 选项
CREATE OR REPLACE VIEW empvu10
(employee_number, employee_name, job_title)
AS SELECT empno, ename, job
FROM emp
WHERE deptno = 10
WITH READ ONLY;
inline内嵌式视图
将from 子句中的子查询起别名
select ename,sal from
emp,
(select deptno,avg(sal) salary from emp group by deptno) a
where emp.deptno=a.deptno
and emp.sal>a.salary;
A就是内嵌式视图
当前语句内起作用
一次性的,在语句外不可引用
Top-n查询
SELECT ROWNUM as RANK, ename, sal
FROM (SELECT ename,sal FROM emp
ORDER BY sal DESC)
WHERE ROWNUM <= 3;
From 子句后为视图,内嵌式。