【SQL】视图

    xiaoxiao2021-03-25  242

    视图解释

    基于 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操作被执行

    1) 创建简单视图

    SQL> CREATE OR REPLACE VIEW VW_DEPT AS SELECT DEPARTMENT_ID,DEPARTMENT_NAME FROM DEPARTMENTS; View created.

    2) 创建复杂视图

    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.

    3) 非空字段不包含在视图中,则无法做INSERT操作

    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")

    4) WITH CHECK OPTION

    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.

    5) WITH READ ONLY

    ##创建只图视图

    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

    6) 删除视图

    SQL> DROP VIEW VW_DEPT1; View dropped.

    转载请注明原文地址: https://ju.6miu.com/read-1054.html

    最新回复(0)