- 常见的数据库对象:
对象 | 描述 |
---|---|
表 | 基本的数据存储集合,由行和列组成 |
视图 | 从表中抽取的逻辑上相关的数据集合 |
序列 | 提供有规律的数值 |
索引 | 提高查询的效率 |
同义词 | 给对象起的别名 |
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> 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号部门员工信息的视图。
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: 无法修改与非键值保存表对应的列
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、删除视图
- 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列。