3.1视图的用途?
1)限制数据的存取:用户只能看到基表的部分信息。方法:赋予用户访问视图对象的权限,而不是表的对象权限。
2)使得复杂的查询变得容易(内联视图):
3) 提供数据的独立性。
3.2 视图的分类
特性 简单视图 复杂视图
表的个数 一个 一个或多个
含函数 无 有
含组函数 无 有
含DISTINCT 无 有
DML 操作 可以 不一定
3.3 语法
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view [(alias[,alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY];
3.3.1 FORCE 作用: 可以先建视图,后建基表
3.3.2 WITH CHECK OPTION 作用:对视图where 子句进行约束。不允许对限定关键字修改。
SCOTT@orcl> create view view2 as select * from emp where deptno = 10 with check option;
3.3.3 WITH READ ONLY 作用:禁止对视图执行DML操作。
SCOTT@orcl> create view view3 as select * from emp where deptno = 10 with read only;
3.3.4 关于视图注意事项。
1) 只要视图中的数据不是来自基表的原始数据,就尽量不要对该数据做DML 操作。
2) 视图的DML操作。
含有如下情况,则不能删除视图中的数据:
含有聚合函数
含有group by 子句
含有 distinct 关键字
含有rownum 这个伪列
含有如下情况,不能修改该视图中的数据:
上面提到的任何一种情况
列由表达式来进行定义的
含有如下情况,不能增加该视图中的数据:
上面提到的任何一种情况。
在基表中包含有NOT NULL约束的列,然而该列并没有在视图中出现
3.3.5 复杂视图的更新,键保留表概念。
select * from user_views ;
-----------------------------------------------------------------------------------------------------------------------
4. 同义词
从字面上理解就是别名的意思,和视图的功能相似。就是一种映射关系。
4.1 私有同义词:
一般是普通用户自己建立的同义词,创建者需要create synonym 权限。
SYS@orcl> grant create synonym to scott; //sys 授权给 scott 建立私有同义词权限
Grant succeeded.
Elapsed: 00:00:00.26
SYS@orcl> conn scott/tiger;
Connected.
SCOTT@orcl> create synonym abc for emp; //scott 建立了一个私有同义词
Synonym created.
Elapsed: 00:00:00.27
SCOTT@orcl> select * from abc; //scott 可以使用这个私有同义词了
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 <null> 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 <null> 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 <null> 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 <null> 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 <null> 20
7839 KING PRESIDENT <null> 17-NOV-81 5000 <null> 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 <null> 20
7900 JAMES CLERK 7698 03-DEC-81 950 <null> 30
7902 FORD ANALYST 7566 03-DEC-81 3000 <null> 20
7934 MILLER CLERK 7782 23-JAN-82 1300 <null> 10
14 rows selected.
Elapsed: 00:00:00.02
SCOTT@orcl>
如何让tim 用户也使用这个私有同义词。
SCOTT@orcl> grant select on scott.emp to tim; //把访问基表的对象权限给 tim
TIM@orcl> select * from scott.abc; //tim 使用同义词时加模式名前缀,OK。
4.2 公有同义词:
一般是由DBA创建,使所有用户都可以使用,创建者需要CREATE PUBLIC SYNONYM 权限。
create public synonym syn2 for ...
(新用户要访问 public synonym(代表 emp 表), 需要有访问基表的权限。
select * from tab; (tab 是什么?); 用下面的查看语句:
select * from all_objects where object_name='TAB';
select * from all_synonyms where synonym_name='TAB';
查看同义词的视图:dba_synonyms
删除私有同义词:drop synonym 同义词名
删除公有同义词:drop public synonym 同义词名
SYS@orcl> select * from dba_synonyms where synonym_name='SYN1';
4.3 关于同义词的几个要点:
1)私有同义词是模式对象,一般在自己的模式中使用,如其他模式使用则必须用模式名前缀 限定。
2)公有同义词不是模式对象,不能用模式名做前缀。(考点)
3)私有和公有同义词同名时,如果指向不同的对象,私有同义词优先。
4)引用的同义词的对象(表或视图)被删除了,同义词仍然存在,这同视图类似,重新创建 该对象名,下次访问同义词时自动编译
5.0 序列
5.1 序列是生成唯一整数值的结构,它的典型用途是用于主键值。
结合真题演示 伪列 nextval, currval 用法
SYS@orcl> create sequence dept_deptno
2 increment by 10
3 start with 50
4 maxvalue 100
5 cycle
6 nocache;
Sequence created.
Elapsed: 00:00:00.13
第一次要引用一下 nextval 伪列
select dept_deptno.nextval from dual;
以后就有 currval 伪列值了。
select dept_deptno.nextval from dual;
15.2 几点说明:
1)最简单的建立序列只需要 create sequence 序列名就可以,注意缺省值,起始是 1,步长 也是 1。 2) 如果启用 cache,缺省只有 20 个号,经验表明这个数量会不够,可以设置多一些,根据 需要 10000 个也可以。
3) cycle 其实没有什么意义,因为它使序列发出重复值,这对于基于序列是主键值的用法是 个问题。 4) 创建序列后可以使用 alter 命令再进行修改。alter 命令和 create 命令基本相同,只有 一点区别:alter 命令不能设置起始值。如果要重启该序列,唯一的办法是删除并重新创建 它。 5) 循环后初始是从 1 开始的, 不管原来的值是如何设的(考点)。