20180331:Oracle中的视图(view)、索引(index)、约束(constraint)、序列(sequence)
一、视图
视图是一个虚拟表,他由存储的查询构成,可以将它的输出看作是一个表,视图同真的表一样,也可以包含一系列带有名称的列和行数据。但是,视图并不在数据库中存储数据值,其数据值来自定义视图的查询语句所引用的表,数据库只在数据字典中存储视图的定义信息。
通过视图修改数据时,实际上就是在修改基本表中的数据。与之对应,改变基本表中的数据也会反映到该表组成的视图中。
创建视图
create [or replace] view <view_name>
[alias,...]
as <subquery>
[with check option] [constraint constraint_name]
[with read only]
查询视图
用户可以通过select语句像查询普通的数据表一样查询视图的信息。
例:在SCOTT模式下,通过select语句查询视图emp_view: select * from emp_view
更新视图
可更新视图要满足以下条件:
- 没有使用连接函数、聚合函数、和组函数;
- 创建视图的select语句中没有聚合函数且没有group by、onnect start with子句以及distinct关键字;
- 创建视图select语句不包括从基表列通过计算所得的列:
- 创建视图没有包含只读属性;
使用update语句可以通过视图修改基本表的数据
例:将emp_view_complex视图中员工编号是7566的员工的工资改为3000:
update emp_view_complex set sal=3000 where empno=7566;
删除视图
当视图不再需要时,用户可以执行drop view语句删除视图,用户可以直接删除其自身模式中的视图,但如果要删除其他模式下的视图,要求该用户必须具有drop any view系统权限
例:drop view emp_view
二、索引
数据库中引出索引的原因:如果要在表中查询指定的记录,,在没有索引的情况下,必须遍历整个表,而有了索引之后,只需要在索引中找到符合查询条件的索引字段值,就可以通过保存在索引中的rowid快速找到表中对应的记录。
建立索引的注意事项:
1.索引应该建立在where子句频繁引用表列上,如果在大表上频繁使用某列或某几个列作为条件执行索引操作,并且检索行数低于总行数15%,那么应该考虑在这些列上建立索引;
2.限制表中的索引个数,索引主要用于加快查询速度,但会降低DML操作的速度,索引越多,DML操作速度越慢,尤其会极大地影响insert和delete操作的速度,因此,规划索引时,必须仔细权衡查询和DML的需求;
3.将表和索引部署到相同的表空间,将表和索引部署到不同的表空间,可以提高访问性能;
4.为了提高多表连接的性能,应该在连接列上建立索引。
创建索引(MySQL的默认索引是B树索引)
上图为B树索引的简单安排。
创建B树索引的语法:
create index 索引名 on 表名 (列明[asc|desc]);
创建位图索引的语法:
create bitmap index 索引名 on 表名 (列明[asc|desc]);
三、约束
约束这里就不过多叙述了,大概就是非空约束(not null),主键约束(primary key),外键约束(foreign key),检查约束什么的了。
四、序列
创建序列
使用create sequence语句创建序列的语法:
create sequence seq_name
[start with n]
[increment by n]
[minvalue n | nomaxvalue]
[cache n| nocycle]
[cycle | nocycle]
[order | no order];
序列有两个”伪列”:nextval序列将要产生的下一个数字;curval序列当前值
管理序列
使用alter sequence语句可以对序列进行修改,需要注意,除了序列的起始值start with不能被修改外,其他可以设置序列的任何子句和参数都可以被修改,如果要修改序列的起始值,则必须先删除序列,然后重构该序列;
这里创建一个序列,作为主键id
创建一个学生表,其中的sid作为主键,利用序列和触发器可以实现Oracle中的主键自增效果:
create table student(
sid int primary key,
sname varchar2(20)
);
创建序列:
create sequence myseq
start with 1
increment by 1;
向学生表中插入一条数据:
insert into student values(myseq.nextval,'小明');
insert into student values(myseq.nextval,'小哥');
最后查询student表,如下:
这里需要注意一点,在Oracle中使用序列时系统使用了一种“延迟段”技术,插入数据时会跳过序列的第一个值,因此,在插入语句后,序列会跳过第一个值,所以有时会从2开始,这里只需更改数据库的”延迟段创建”特性即可,在system模式下修改:
alter system set deferred_segment_creation=false;
上一篇: python post 请求