当前位置:网站首页 > 技术博客 > 正文

oracle建视图语句



视图

:是基于一个表或多个表或

视图

的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改。

视图

基于的表称为基表,

Oracle

数据库

对象分为五种:表,

视图

,序列,索引和同义词。

视图

是存储在数据字典里的一条select语句。通过

创建视图

可以提取数据的逻辑上的集合或组合。

视图

的优点:

1.对

数据库

的访问,因为

视图

可以有选择性的选取

数据库

里的一部分。

2.用户通过简单的查询可以从复杂查询中得到结果。

3.维护数据的独立性,试图可从多个表检索数据。

4.对于相同的数据可产生不同的

视图

视图

分为简单

视图

和复杂

视图

1、简单

视图

只从单表里获取数据,复杂

视图

从多表;

2、简单

视图

不包含函数和数据组,复杂

视图

包含;

3、简单

视图

可以实现DML操作,复杂

视图

不可以。

语法结构:

创建视图

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name

[(alias[, alias]...)]

AS subquery

[WITH CHECK OPTION [CONSTRAINT constraint]]

[WITH READ ONLY]

语法解析:

OR REPLACE :若所

创建

的试图已经存在,则替换旧

视图

FORCE:不管基表是否存在

ORACLE

都会自动

创建

视图

(即使基表不存在,也可以

创建

视图

,但是该

视图

不能正常

使用

,当基表

创建

成功后,

视图

才能正常

使用

);

NOFORCE :如果基表不存在,无法

创建视图

,该项是默认选项(只有基表都存在

ORACLE

才会

创建

视图

)。

alias:为

视图

产生的列定义的别名;

subquery :一条完整的SELECT语句,可以在该语句中定义别名;

WITH CHECK OPTION :插入或修改的数据行必须满足

视图

定义的约束;

WITH READ ONLY :默认可以通过

视图

对基表执行增删改操作,但是有很多在基表上的限制(比如:基表中某列不能为空,但是该列没有出现在

视图

中,则不能通过

视图

执行insert操作),WITH READ ONLY说明

视图

是只读

视图

,不能通过该

视图

进行增删改操作。现实开发中,基本上不通过

视图

对表中的数据进行增删改操作。

案例3:基于EMP表和DEPT表

创建视图

代码演示:

视图

SQL> CREATE OR REPLACE VIEW EMPDETAIL

2 AS

3 SELECT EMPNO,ENAME,JOB,HIREDATE,EMP.DEPTNO,DNAME

4 FROM EMP JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO

5 WITH READ ONLY

6 /

VIEW CREATED

SQL> SELECT * FROM EMPDETAIL; ①

EMPNO

ENAME

JOB

HIREDATE

DEPTNO

DNAME

7369

SMITH

CLERK

17-12月-80

20

RESEARCH

7499

ALLEN

SALESMAN

20-2月 -81

30

SALES

7521

WARD

SALESMAN

22-2月 -81

30

SALES

7566

JONES

MANAGER

02-4月 -81

20

RESEARCH

7654

MARTIN

SALESMAN

28-9月 -81

30

SALES

7698

BLAKE

MANAGER

01-5月 -81

30

SALES

7782

CLARK

MANAGER

09-6月 -81

10

ACCOUNTING

7788

SCOTT

ANALYST

19-4月 -87

20

RESEARCH

7839

KING

PRESIDENT

17-11月-81

10

ACCOUNTING

7844

TURNER

SALESMAN

08-9月 -81

30

SALES

7876

ADAMS

CLERK

23-5月 -87

20

RESEARCH

7900

JAMES

CLERK

03-12月-81

30

SALES

7902

FORD

ANALYST

03-12月-81

20

RESEARCH

7934

MILLER

CLERK

23-1月 -82

10

ACCOUNTING

14 ROWS SELECTED

代码解析:

① 对

视图

可以像表一样进行查询。该

视图

中隐藏了员工的工资。

删除 视图

可以

使用

“DROP VIEW

视图

名称”,

删除 视图

不会影响基表的数据。

例如:

CREATE OR REPLACE VIEW dept_sum_vw(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;

视图

的定义原则:

1.

视图

的查询可以

使用

复杂的SELECT语法,包括连接/分组查询和子查询;

2.在没有WITH CHECK OPTION和 READ ONLY 的情况下,查询中不能

使用

ORDER BY 子句;

3.如果没有为CHECK OPTION约束命名,系统会自动为之命名,形式为SYS_Cn;

4.OR REPLACE选项可以不

删除

视图

便可更改其定义并重建,或重新授予对象权限。

视图

的查询:

视图 创建

成功后,可以从

视图

中检索数据,这点和从表中检索数据一样。

还可以查询

视图

的全部信息和指定的数据行和列。 如:检索数据:

SQL>SELECT * FROM dept_sum_vw;

查询

视图

定义:

SELECT view_name,text from user_views;

其中text显示的内容为

视图

定义的SELECT语句,可通过DESC USER_VIEWS 得到相关信息。

修改

视图

通过OR REPLACE 重新

创建

同名

视图

即可。

视图

上的DML 操作:

DML操作应遵循的原则:

1.简单

视图

可以执行DML操作;

2.在

视图

包含GROUP 函数,GROUP BY子句,DISTINCT关键字时不能

删除

数据行;

3.在

视图

不出现下列情况时可通过

视图

修改基表数据或插入数据:

a.

视图

中包含GROUP 函数,GROUP BY子句,DISTINCT关键字;

b.

使用

表达式定义的列;

c.ROWNUM伪列。

d.基表中未在

视图

中选择的其他列定义为非空且无默认值。

视图

可用于保持

数据库

的完整性,但作用有限。

通过

视图

执行引用完整性约束可在

数据库

级执行约束。

WITH CHECK OPTION 子句限定:

通过

视图

执行的INSERTS和UPDATES操作不能

创建

视图

检索不到的数据行,因为它会对插入或修改的数据行执行完整性约束和数据有效性检查。

例如:

CREATE OR REPLACE VIEW vw_emp20

AS SELECT * FROM emp

WHERE deptno=20

WITH CHECK OPTION constraint vw_emp20_ck;

视图

已建立。

查询结果:

复制代码

SELECT empno,ename,job FROM vw_emp20;

EMPNO ENAME JOB

--------------------- -------------- -------------

7369 SMITH CLERK

7566 JONES MANAGER

7902 FORD ANALYST

复制代码

修改:

UPDATE vw_emp20

SET deptno=20

WHERE empno=7902;

将产生错误:

UPDATE vw_emp20

*

ERROR 位于第一行:

ORA-01402:

视图

WITH CHECK OPTION 违反WHERE 子句

视图

删除

:DROP VIEW VIEW_NAME语句

删除 视图

删除 视图

的定义不影响基表中的数据。

只有

视图

所有者和具备DROP VIEW权限的用户可以

删除 视图

视图

删除

后,基于被

删除 视图

的其他

视图

或应用将无效。

版权声明


相关文章:

  • hikariconfig连接池2025-07-08 19:30:05
  • kvm虚拟化技术的实现方式2025-07-08 19:30:05
  • storm flink区别2025-07-08 19:30:05
  • html简单框架2025-07-08 19:30:05
  • java中序列化与反序列化2025-07-08 19:30:05
  • c语言if(!f)函数的使用方法?2025-07-08 19:30:05
  • python 有趣的项目2025-07-08 19:30:05
  • 内存trfc根据什么调整2025-07-08 19:30:05
  • 正品蓝导航—最全收入2025-07-08 19:30:05
  • dds协议编程2025-07-08 19:30:05