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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值