视图是Oracle系统中经常被用到的概念。也是关系型数据库中一个重要的概念。
以下是我对视图的认识,比较浅薄,但是是OCP考试的内容。算是抛砖引玉吧。
视图的本质是select 语句,理解上更像一个别名,没有数据,如果删除视图里的数据,表中数据就会被删除。 可以基于任何select 语句创建视图。
视图的简单分类如下:
1 简单视图 --- 不使用聚合、函数 ,一般能DML,但是有时候要注意约束。
2 复杂视图-- 使用 聚合或者函数,一般不能DML。
复杂视图举例
SQL> create or replace view v_emp as select deptno,count(*) empcount from emp group by deptno
2 /
View created.
SQL> select * from v_emp
2 /
DEPTNO EMPCOUNT
---------- ----------
30 6
20 5
10 3
SQL> delete from v_emp
2 /
delete from v_emp
*
ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view
可是为什么 "复杂视图" 无法删除呢?
复杂视图更像是一个查询一个函数操作,在执行查询的时候才有意义。
本身在数据库中并不存储,所以既然不存在 你删除什么?可是为什么不能Insert,因为oracle database engine无法反转group by 函数的作用。
对于简单视图,删除的是标准的内容。但是也不能违背表本身的数据完整性,当你用视图插入数据的时候(表中其它列没有Not null约束,或者有默认值)
可见一个概念,我们不知道要知道是什么,还要知道为什么。就是多问问问题的本质。通过推理加深对概念的印象。