欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Oracle视图、索引、序列

程序员文章站 2024-01-22 21:40:46
...

一、视图

概念:视图是一个虚拟表,它由存储的查询构成,可以将它的输出看作是一张表。视图同真表一样,也可以包含一系列带有名称的列和行数据。但是,视图并不在数据库中存储数据值,其数据值来自定义视图的查询语句所引用的表,数据库只在字典中存储视图的定义信息。

      通过视图修改数据时,实际上就是在修改基本表中的数据。与之相对应,改变基本表中的数据也会反映到由该表组成的视图中。


创建视图

      使用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;

      创建结果:

      Oracle视图、索引、序列

查询视图

用户可以通过select语句像查询普通的数据表一样查询视图的信息。

eg:select * from  emp_view;

查询结果:

Oracle视图、索引、序列

更新视图

可更新视图满足以下条件:

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';

修改及查询结果:

Oracle视图、索引、序列

删除视图

当视图不在需要时,用户可以执行DROP VIEW语句删除视图。用户可以直接删除其自身模式中的视图,但如果要删除其他用户模式中的视图,要求该用户必须具有DROP ANY VIEW 系统权限。

eg:删除视图emp_view

drop view emp_view; 

删除结果:

Oracle视图、索引、序列


二、索引

      如果要在表中查询指定的记录,在没有索引的情况下,必须遍历整个表,而有了索引之后只需要在索引中找到符合查询条件的索引字段的值,就可以通过保存在索引中的rowid快速找到表中对应的记录。

建立索引的注意事项:

1、索引应该建立在WHERE子句频繁引用表列上

2、限制表中的索引个数,索引主要用于加快查询速度,但会降低DML操作的速度;索引越多,DML操作速度越慢,尤其会极大地影响INSERT和DELETE操作的速度。因此,规划索引时,必须仔细权衡查询和DML的需求

3、指定索引块空间的使用参数

4、将表和索引部署到相同的表空间,可以简化表空间的管理将表和索引部署到不同的表空间,可以提高访问性能

5、为了提高多表连接的性能,应该在连接列上建立索引。

创建索引

使用SQL命令创建索引

1、创建B(Balance)树索引(Oracle默认索引)

Oracle视图、索引、序列

语法:

CREATE INDEX 索引名 ON 表名 (列名[ASC | DESC],...);

eg:为emp表的sal列创建索引

create index emp_sal_index on emp(sal);

创建结果:

Oracle视图、索引、序列

2、创建位图(bitmap)索引

Oracle视图、索引、序列

语法:

CREATE BITMAP INDEX 索引名 ON 表名 (列名[ASC | DESC],...);

eg:在deptno字段上设置位图索引

create bitmap index emp_deptno_index on emp(deptno);

创建结果:

Oracle视图、索引、序列

维护索引

使用SQL命令维护索引

eg:重命名索引emp_deptno_index

alter index emp_deptno_index rename to deptno_index;

更改结果:

Oracle视图、索引、序列


三、序列

创建序列

使用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;

创建结果:

Oracle视图、索引、序列

序列有两个“伪列”:

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;

创建结果:

Oracle视图、索引、序列

插入记录:直到小于等于200

insert into student values(s_seq.nextval,'张三',78.5);

查询一下:

Oracle视图、索引、序列

张三的id不是从1开始,而是从100开始,原因是,在常见序列时给定了初始值100,所以在插入第一条数据时id为100

insert into student values(s_seq.nextval,'李四',88.5);

我们可以插入多条数据进行测试,测试一下最大值的用处

Oracle视图、索引、序列

插入多条数据后stuid达到200,在次进行插入数据

Oracle视图、索引、序列

当值大于200的时候再次进行插入数据的操作后就会报错

管理序列

使用ALTER SEQUENCE语句可以对序列进行修改。需要注意,除了序列的起始值START WITH不能修改之外,其它可以设置序列的任何子句和参数都可以被修改。如果要修改序列的起始值,则必须先删除序列,然后重建序列