视图
什么是视图?
视图表的一种形式,是一种逻辑表。视图基于表或者其他视图。视图中并没有真正的数据,只是提供了另一个
视角去查看或改变表中的数据。视图的本质是一个select语句。
为什么要用视图?
1,视图可以起到隐藏数据的功能。在基于表中字段创建视图时,可以选择性的显示表中的字段。
2,视图可以将复杂的多表链接查询的结果存放到一个简单的表结构中。
视图的分类
可以分为简单视图和复杂视图。
简单视图:涉及的表数目:1个,不包含函数,不包含数据分组,进行DML操作。
复杂视图:涉及的表数目:1个或多个,包含函数,包含数据分组,不可以进行DML操作。
视图的存储和执行
视图可以通过查询数据字典视图user_views得到视图的名字和视图的定义。
构成视图的select语句的文本被存储在Long字段中。
select * from user_views;
当用户从视图中查询数据时,Oracle数据库先从user_views中获得视图的定义,然后将对视图的查询转换为对
基表的查询操作。
简单视图
创建形式
create [on replace] | [force | noforce] view view_name [(aliaslist)] as subquery
[with check option [contraint c_name]]
[with read only];
on replace: 当视图已经存在的时,就将其替换,重新创建。
force: 视图的创建,不管基表是否存在。
noforce: 视图的创建,基表必须存在。不然创建不成功。默认的
aliaslist: 表示视图的字段。
subquery: 表示子查询。
with check option: 表示只有在可访问的行,才能被插入或更新。
with read only: 表示这个视图只能读取,不能执行DML操作。
create on replace view myview ('id', 'name') as
select employee_id, last_name from employees;
查询视图
select * from myview [where];
复杂视图
复杂视图涉及的表多于1个,所以不能进行DML操作。
创建形式
create on replace view myview (name, avg_salary, min_salary, max_salary) as
select d.department, avg(e.salary), min(e.salary), max(e.salary) from
employees e, departments d where e.employee_id = d.department_id group by d.department_name;
视图的DML操作
只是针对简单视图的。
删除视图
delete from myview where id = 20;
更新视图
update myview set name = 'xxx' where id = 20;
插入视图
insert into myview values (2, 'xxx');
注意:在插入时,可能会出现错误。为啥呢?因为,在依据基表个别字段创建视图时,
在视图插入的只是这几个字段的值,其他字段的值没法输入,就为空。
如果剩下的字段中not null,那么就会出错。如果剩下的字段中没有not null,就不会报错。
DML操作规则
在没有组函数,没有group by子句,没有distinct关键字的基础上。
如果视图中有伪列rownum关键字,那么就不能进行删除操作。
如果视图中有伪列rownum,有表达式定义的字段,就不能进行更新操作。
如果视图中有伪列rownum,有表达式定义的字段,基表中有not null字段,就不能进行插入操作。
with check option子句
通过视图可执行的行进行插入和更新的操作,不能产生视图不能选择的行。
不太懂?写个例子吧!
先创建一个视图:视图的字段从select中获取,假设不存在not null 约束。
create view myview as select * from employees where department_id = 20 with check option contraint myview_con;
更新视图:
update myview set department_id = 30 where last_name = 'xxx';
这样就会报错,因为创建视图的时候,deparment_id 的限制为20,但是在更新时,将其换为30,就会出错。这就是产生了视图不能选择的行。
序列
什么是序列?有什么用?
序列式数据库的对象,可以让数据库产生一系列的唯一的数字。主要用于创建一个主键的值。
创建序列
create sequence sequence_name
[increnment by n]
[start with n]
[{maxvalue n | nomaxvalue}]
[{minvalue n | nominvalue}]
[{cycle | nocycle}]
[{cache n | nocahce}];
increnment by n: 序号之间的间隔,n 是一个整数,默认是1
start with n: 序号从n开始。
maxvalue n: 规定最大值。当达到最大值时,根据cycle的情况,再进行循环或是提示。
nomaxvalue: 规定没有最大值。默认,升序的最大值是1027,降序的最小值是-1;
cycle: 达到最大值或最小值时,进行循环。
nocycle: 达到最大值或最小值时,不进行循环。
cache n: 缓冲值的个数。默认是20个。可以用于提高性能。
使用序列
nextval,currval
使用 序列名.nextval 会将一个新的序列值产生并放到current中。
注意:序列的产生可能会有间隙。毕竟序列的产生不依赖于事务。
当一个事务在提交前使用nextval,然后在回滚事务,但是序列是不会进行回滚的。
所以再次产生序列,就会出现间隔。
还有就是系统崩溃时会产生序列。
修改和删除序列
alter sequence sequence_name
[increnment by n]
[start with n]
[{maxvalue n | nomaxvalue}]
[{minvalue n | nominvalue}]
[{cycle | nocycle}]
[{cache n | nocahce}];
修改序列后,只有以后的序列会受到影响,之前的不会受到影响。
并且修改序列的部分不能使原来的序列产生错误,比如:修改的最大值小于当前的序列值。
删除序列
drop sequence sequence_name;
索引
什么是索引?有什么用?
索引是数据库的对象,通过指针的形式提高查询的速度。也就相当于一本书的目录。
索引的创建可以显示的创建,也可以隐式的创建。
索引由Oracle数据库维护,当一个表进行DML操作时,Oracle会自动进行维护索引。
索引虽然可以提高查询速度,但是相应的也会带来系统的开销。所以对于一个表而言,是否创建索引,
创建多少个索引,在哪些字段创建索引,是数据库管理员根据该表的常用操作而做决定的。
比如一个表数据量大,但是经常被用于查询,就建议建立索引。小表的话,经常被插入,删除,就不建立创建多个索引。
在数据表中,伪列rowid是一个16进制的串,访问指定的行的最快的方法就是引用它的rowid。
创建索引
create [unique] index index_name on table(col1, col2,.....);
unique 表示建立的是唯一索引还是非唯一索引。
create index myindex on employees(lower(last_name));
在查询时速度会变快。
select * from employees where lower(last_name) = 'xxx';
删除索引
drop index index_name;