基于 SQL 语句的结果集的可视化的表,包含行和列,就像一个真实的表,其中的字段就是来自一个或多个真实表中的字段。
视图分类:简单视图、复杂视图
特性 简单视图 复杂视图 表的数目 一个 一个或多个 包含函数 无 有 包含数据分组 无 有 通过视图进行DML操作 是 不一定
CREATE [OR REPLACE][FORCE|NOFORCE] VIEWview_name [(alias[,alias]...)]
AS subquery
[WITH CHECK OPTION[CONSTRAINTconstraint_name]]
[WITH READ ONLY[CONSTRAINTconstraint_name]];
子句含义OR REPLACE如果视图已经存在则重新创建FORCE创建视图,不管基表是否存在(如果不存在,会提示“编译错误”)NOFORCE只在基表存在的情况下创建视图(默认值)view_name视图的名称alias为由视图查询选择的表达式指定名字(别名的个数必须与由视图选择的表达式的个数匹配)subquery是一个完整的SELECE语句(SELECT列表中的字段可以使用别名)WITH CHECK OPTION指定只有可访问的行在视图中才能被插入或修改CONSTRAINTCHECK OPTION约束的名字WITH READ ONLY确保在该视图中没有DML操作被执行
SQL> CREATE OR REPLACE VIEW VW_DEPT AS SELECT DEPARTMENT_ID,DEPARTMENT_NAME FROM DEPARTMENTS; View created.
SQL> CREATE OR REPLACE VIEW VW_EMPLOYEES AS 2 SELECT EMPLOYEE_ID,LAST_NAME,EMAIL,to_char(HIRE_DATE,'yyyy-mm-dd') as HIRE_DATE,JOB_ID 3 FROM EMPLOYEES; View created.
SQL> CREATE OR REPLACE VIEW VW_EMP AS SELECT EMPLOYEE_ID,LAST_NAME,SALARY,JOB_ID FROM EMPLOYEES; View created. ##基表EMPLOYEES表中的EMAIL字段是非空字段,但却没有包含在视图中,当做INSERT操作时会报错。这是因为当我们做视图INSERT操作时,其实是对包含在视图中的基表的列做INSERT,而不包含在视图中的列默认插入了空值或者默认值。基表中的EMAIL列是非空的,但却没有对其插入数据,这样就违反了NOT NULL约束,故报错。
SQL> INSERT INTO VW_EMP VALUES (5611,'lgr',8000,'SA_REP'); INSERT INTO VW_EMP VALUES (5611,'lgr',8000,'SA_REP') * ERROR at line 1: ORA-01400: cannot insert NULL into ("HR"."EMPLOYEES"."EMAIL")
SQL> CREATE OR REPLACE VIEW VW_DEPT AS SELECT DEPARTMENT_ID,DEPARTMENT_NAME FROM DEPARTMENTS WHERE DEPARTMENT_ID<=100 WITH CHECK OPTION; View created.
##插入不满足WHERE条件的数据,提示违反了CHECK子句
SQL> INSERT INTO VW_DEPT VALUES(1000,'LGR'); INSERT INTO VW_DEPT VALUES(1000,'LGR') * ERROR at line 1: ORA-01402: view WITH CHECK OPTION where-clause violation ##但插入满足条件的数据,可以成功插入
SQL> INSERT INTO VW_DEPT VALUES (1,'LGR'); 1 row created.
##创建只图视图
SQL> CREATE OR REPLACE VIEW VW_DEPT1 AS SELECT DEPARTMENT_ID,DEPARTMENT_NAME FROM DEPARTMENTS WHERE DEPARTMENT_ID<=100 WITH READ ONLY; View created.
##当做DML操作时报错
SQL> INSERT INTO VW_DEPT1 VALUES (2,'lgr'); INSERT INTO VW_DEPT1 VALUES (2,'lgr') * ERROR at line 1: ORA-42399: cannot perform a DML operation on a read-only view
SQL> DROP VIEW VW_DEPT1; View dropped.