微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Oracle专题9之Oracle的数据库对象-视图

- 常见的数据库对象:

对象 描述
基本的数据存储集合,由行和列组成
视图 从表中抽取的逻辑上相关的数据集合
序列 提供有规律的数值
索引 提高查询的效率
同义词 给对象起的别名

1、Oracle的视图介绍和创建

a、什么是视图?

  • 视图是一个虚拟的表,视图建立在已有表的基本上,视图赖以建立的这些表称之为基表。
  • 向视图提供数据内容的语句称之为SELECT语句。

b、为什么要使用视图?

  • 主要出于两个原因:
  • 1、安全原因,限制数据访问;2、视图可使复杂的查询易于理解和使用。

c、视图的分类

  • 视图分为简单视图、复杂视图、连接视图、只读视图: 1、简单视图只从单表里获取数据;不包含函数和数据组。 2、复杂视图从多表获取数据;包含函数和数据组。 3、连接视图是指基于多个表建立的视图,使用连接视图能够简化连接查询。 4、只读视图只允许使用select语句,不允许其他DML语句的操作。
  • 附加说明:DML(data manipulation language):它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言。

d、如何创建视图?

  • 创建视图的语法格式:CREATE [OR REPLACE] VIEW view [(alias[,alias]...)] AS subquery [WITH CHECK OPTION [ CONSTRAINT constraint]] [WITH READ ONLY];
  • 需要注意的是,Oracle数据库用户必须具有CREATRE VIEW权限才能够创建视图。
  • 简单视图的创建示例:
  • 建立用于查询员工号、姓名、工资的视图。
sql> conn sys/02000059 as sysdba;
	已连接。
	sql> grant create view to scott;
	授权成功。
	sql> conn scott/02000059
	已连接。
	sql> create VIEW emp_view AS select empno,ename,sal FROM emp;
	视图已创建。
	```
	-  视图是一张虚拟的表,和表一样,可以通过SELECT语句进行查询
sql> select * from emp_view;
			 EMPNO ENAME             SAL
				7951 EASON            3000
				7369 G_EASON           800
				7499 ALLEN            1600
				......
				7900 JAMES             950
				7902 FORD             3000
				7934 MILLER           1300
	已选择15行。
```
sql> create VIEW emp_view2(员工号,员工名,工资) AS select empno,sal FROM emp;
		视图已创建。
		sql> select * from emp_view2;
				员工号 员工名           工资
					7951 EASON            3000
					7369 G_EASON           800
					7499 ALLEN            1600
					7521 WARD             1250
					......
					7876 AdamS            1100
					7900 JAMES             950
					7902 FORD             3000
					7934 MILLER           1300
		已选择15行。
	```


-----

-  创建连接视图示例:
-  建立用于获取部门号为10的部门号、部门名称以及员工信息。
sql> CREATE VIEW dept_emp_view AS SELECT d.deptno,d.dname,e.empno,e.ename,e.job FROM dept d,emp e WHERE d.deptno = e.deptno AND d.deptno = 10;
视图已创建。
	sql> select * from dept_emp_view;
					DEPTNO DNAME           EMPNO ENAME      JOB
					10 ACCOUNTING           7782 CLARK      MANAGER
					10 ACCOUNTING           7839 KING       PRESIDENT
					10 ACCOUNTING           7934 MILLER     CLERK
```
  • 只读视图示例:建立查看10号部门员工信息的视图。
sql> CREATE VIEW emp_view3 AS select * from emp where deptno = 10 with read only;
	视图已创建。
	sql> update emp_view3 set sal = sal + 50;
	update emp_view3 set sal = sal + 50
	第 1 行出现错误:
	ORA-42399: 无法对只读视图执行 DML 操作

2、Oracle视图的查询修改删除

a、视图上的DML操作

  • 查询视图-select,如:select * from emp_view;
  • 添加数据-insert,如:insert into empnew_view(empno,sal) values(8888,'LAYNA',6666);
  • 修改数据-update,如:update emp_view set sal = sal + 100 where empno = 8888;
  • 删除数据-delete,如:delete from emp_view where empno = 8888;
  • 注意:针对视图的更新操作(insert、update、delete)实际上改变的是基表中的数据。

b、在创建视图时定义check约束

  • WITH CHECK OPTION选项用于在视图上定义CHECK约束
  • 示例:CHREATE VIEW emp_view4 AS SELECT * FROM emp_view WHERE deptno = 20 WITH CHECK OPTION chk_view;
sql> create view dept_emp_view2 as select * from dept_emp_view where deptno = 10 with check option constraint ck_view;
	视图已创建。
	sql> select * from dept_emp_view2;
			DEPTNO DNAME               EMPNO ENAME      JOB
					10 ACCOUNTING           7782 CLARK      MANAGER
					10 ACCOUNTING           7839 KING       PRESIDENT
					10 ACCOUNTING           7934 MILLER     CLERK
	sql> update dept_emp_view set deptno = 20 where empno = 7782;
	update dept_emp_view set deptno = 20 where empno = 7782
	第 1 行出现错误:
	ORA-01779: 无法修改与非键值保存表对应的列
  • check约束的作用是在添加或者修改数据时数据必须满足with check option前的where子句的条件。如上例:修改添加数据时deptno 的值必须为10。

c、修改视图

  • 使用CREATE OR REPLACE VIEW 子句修改视图。
  • 示例:CREATE OR REPLACE VIEW emp_view AS SELECT * FROM emp WHERE job = 'SALESMAN';
sql> CREATE OR REPLACE VIEW emp_view AS SELECT * FROM emp WHERE job = 'SALESMAN';
	视图已创建。

d、删除视图

  • 当视图不再需要时,用户可以执行DROP view语句删除视图。(不会删除基表)
sql> DROP VIEW emp_view;
	视图已删除sql> select * from emp_view;
	select * from emp_view
	第 1 行出现错误:
	ORA-00942: 表或视图不存在
	```
# 3、Oracle的复杂视图
## a、什么是复杂视图?
-  复杂视图是指包含函数、表达式或者分组数据的视图,它主要用于执行查询操作。
-  注意:当定义复杂视图时,必须要为函数或者表达式定义列的别名。
## b、创建复杂视图
-  示例:创建用于获得每个岗位平均工资、工资总和、最高工资和最低工资的视图。
sql> create VIEW job_view(job,avgsal,sumsal,maxsal,minsal) AS SELECT job,avg(sal),sum(sal),max(sal),min(sal) FROM emp GROUP BY job;
视图已创建。
sql> select * from job_view;
JOB           AVGSAL     SUMSAL     MAXSAL     MINSAL
CLERK         1037.5       4150       1300        800
SALESMAN        1400       5600       1600       1250
PRESIDENT       5000       5000       5000       5000
MANAGER   2758.33333       8275       2975       2450
ANALYST         3000       9000       3000       3000
## c、复杂视图上执行DML操作的原则
-  DELETE操作原则,视图中包含以下元素之一不能执行delete操作:
-  group by子句、分组函数distinct关键字、rownum伪列。
-----
-  UPDATE操作原则,视图中包含以下元素之一不能执行update操作:
-  group by子句、分组函数、dinstinct关键字、rownum伪列、使用表达式定义的列。
-----
-  INSERT操作原则,视图中包含以下元素之一不能执行insert操作:
-  group by子句、分组函数、dinstinct关键字、rownum伪列、使用表达式定义的列、视图上没有包含基表的NOT NULL列。

原文地址:https://www.jb51.cc/oracle/206780.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐