Oracle视图、索引、序列
一、视图
概念:视图是一个虚拟表,它由存储的查询构成,可以将它的输出看作是一张表。视图同真表一样,也可以包含一系列带有名称的列和行数据。但是,视图并不在数据库中存储数据值,其数据值来自定义视图的查询语句所引用的表,数据库只在字典中存储视图的定义信息。
通过视图修改数据时,实际上就是在修改基本表中的数据。与之相对应,改变基本表中的数据也会反映到由该表组成的视图中。
创建视图
使用CREATE VIEW语句创建视图
语法:
create [or replace] view <view_name>
[alias[,alias]...]
as <subquery>
[with check option] [constraint constraint_name]
[with read only]
eg:创建emp表的视图,视图中只包含empno、ename、job这三列
create view emp_view as select empno,ename,job from emp;
创建结果:
查询视图
用户可以通过select语句像查询普通的数据表一样查询视图的信息。
eg:select * from emp_view;
查询结果:
更新视图
可更新视图满足以下条件:
1、没有使用连接函数、聚合函数和组函数
2、创建视图的SELECT语句中没有聚合函数且没有GROUP BY、ONNECT BY、START WITH子句以及DISTINCT关键字
3、创建视图的SELECT语句中不包括从基表列通过计算所得的列
4、创建视图没有包含只读属性
使用update语句可以通过视图修改基本表中的数据
eg:将emp_view_complex视图中员工编号是7566的员工的工资改为3000
update emp_view_complex set sal=3000 where empno=7566;
修改视图的定义
使用SQL命令修改视图
eg:创建一个查询员工姓名为"SCOTT"的员工的工作和部门名称
create or replace view emp_view as
select ename,job,dname from emp inner join dept
on emp.deptno=dept.deptno and emp.ename='SCOTT';
修改及查询结果:
删除视图
当视图不在需要时,用户可以执行DROP VIEW语句删除视图。用户可以直接删除其自身模式中的视图,但如果要删除其他用户模式中的视图,要求该用户必须具有DROP ANY VIEW 系统权限。
eg:删除视图emp_view
drop view emp_view;
删除结果:
二、索引
如果要在表中查询指定的记录,在没有索引的情况下,必须遍历整个表,而有了索引之后只需要在索引中找到符合查询条件的索引字段的值,就可以通过保存在索引中的rowid快速找到表中对应的记录。
建立索引的注意事项:
1、索引应该建立在WHERE子句频繁引用表列上
2、限制表中的索引个数,索引主要用于加快查询速度,但会降低DML操作的速度;索引越多,DML操作速度越慢,尤其会极大地影响INSERT和DELETE操作的速度。因此,规划索引时,必须仔细权衡查询和DML的需求
3、指定索引块空间的使用参数
4、将表和索引部署到相同的表空间,可以简化表空间的管理将表和索引部署到不同的表空间,可以提高访问性能
5、为了提高多表连接的性能,应该在连接列上建立索引。
创建索引
使用SQL命令创建索引
1、创建B(Balance)树索引(Oracle默认索引)
语法:
CREATE INDEX 索引名 ON 表名 (列名[ASC | DESC],...);
eg:为emp表的sal列创建索引
create index emp_sal_index on emp(sal);
创建结果:
2、创建位图(bitmap)索引
语法:
CREATE BITMAP INDEX 索引名 ON 表名 (列名[ASC | DESC],...);
eg:在deptno字段上设置位图索引
create bitmap index emp_deptno_index on emp(deptno);
创建结果:
维护索引
使用SQL命令维护索引
eg:重命名索引emp_deptno_index
alter index emp_deptno_index rename to deptno_index;
更改结果:
三、序列
创建序列
使用CREATE SEQUENCE语句创建序列的语法:
create sequence <seq_name>
[start with n]
[increment by n]
[minvalue n | nominvalue]
[maxvalue n | nomaxvalue]
[cache n | nocycle]
[cycle | nocycle]
[order | noorder]
说明:
start with n 从第几行开始
increment by n 每次增加的数量
minvalue/maxvalue 最小/大值
cache n 缓冲区大小
cycle 生存周期
eg:创建序列
create sequence myseq;
创建结果:
序列有两个“伪列”:
nextval序列将要产生的下一个数字
currval序列当前的值
注意:Oracle中是没有自增属性,跟MySQL是有一定区别的,MySQL中可以根据auto_increment关键字来实现某一列的自增,但Oracle不行
eg:创建学生表,是学生的id自增
创建学生表
create table student(
stuid int primary key,
stuname varchar2(20),
score number
);
创建序列:
create sequence s_seq
start with 100
increment by 20
maxvalue 200;
创建结果:
插入记录:直到小于等于200
insert into student values(s_seq.nextval,'张三',78.5);
查询一下:
张三的id不是从1开始,而是从100开始,原因是,在常见序列时给定了初始值100,所以在插入第一条数据时id为100
insert into student values(s_seq.nextval,'李四',88.5);
我们可以插入多条数据进行测试,测试一下最大值的用处
插入多条数据后stuid达到200,在次进行插入数据
当值大于200的时候再次进行插入数据的操作后就会报错
管理序列
使用ALTER SEQUENCE语句可以对序列进行修改。需要注意,除了序列的起始值START WITH不能修改之外,其它可以设置序列的任何子句和参数都可以被修改。如果要修改序列的起始值,则必须先删除序列,然后重建序列