oracle数据库对象(学习Oracle第8天)
一、学习目标:
1.创建序列
2.创建索引
3.创建视图
4.同义词
二、序列 Sequence
序列是一个数据库对象,用于生成一序列的不重复的整数。类似于SQL server的自动增长类型。
查看序列的信息
可以通过查看user_sequences视图了解序列的信息
select * from user_sequences order by sequence_name;使用序列:
创建序列之后,序列可以产生一系列的数值。可以通过currval和nextval来访问它们来获取当前值和下一个值。
语法:
select 序列名.currval/序列名.nextval from dual;--创建序列
create sequence mysequence
start with 0
increment by 1
MAXVALUE 100000000
MINVALUE 0;--查询序列
select * from user_sequences order by sequence_name; //所有序列按照序列名升序查询select mysequence.nextval from dual;
select mysequence.currval from dual;select * from students;
delete from students;
alter table students drop constraint nq_name;
insert into students values(mysequence.nextval,'张鹏','男','1998-10-25','抚州市临川区'); //执行5次
--执行5次之后
--修改序列
修改序列可以使用ALTER SEQUENCE语句进行修改。修改有一些限制如下:
1.初始值不能修改
2.序列的最小值不能大于当前序列的值
3.序列的最大值不能小于当前序列的值例如:修改mysequence序列的增长值为2
alter sequence mysequence increment by 2;
--删除序列
DROP sequence mysequence;
三、索引
类似于书的目录,加快表的查询速度。给列加索引
--创建B-Tree索引
--给学生表sname字段创建索引
create index i_students_sname on students(sname);
--创建唯一索引 unique index
create unique index i_emp_ename on students(ename);
--创建函数索引
--给emp表ename字段添加函数索引
create index i_func_emp_ename on emp(UPPER(ename));
select * from emp where ename = upper('smith');
--创建位图索引
在emp表的ename列上创建位图索引
CREATE BITMAP INDEX i_emp_ename on emp(ename);
--查看用户指定表的索引信息
select index_name , table_name , uniqueness , status
from user_indexes
where table_name in ('EMP','STUDENTS')
order BY index_name;--查看某列的索引信息
select index_name , table_name , column_name
from user_ind_columns
where table_name in ('EMP','STUDENTS')
order BY index_name;
--修改索引
可以使用ALTER INDEX语句修改索引
例如:修改i_students_sname索引名为i_students_sname_zhi索引
ALTER index i_students_sname rename to i_students_sname_zhi;--删除索引
可以使用DROP INDEX删除索引
DROP INDEX 索引名;
三、视图
视图是基于已知的一张表或多张表的查询。
select * from students;
select * from score;
insert into students values(mysequence.nextval,'sss','女','2000-11-05','杭州市下城区');select s.sid , sname , s.cid , cname , score
from score s , students stu , course c
where s.sid = stu.sid and s.cid = c.cid;--视图是虚拟的,物理不存在的,表是物理存在的
--创建视图
create view students_score_view as
select s.sid , sname , s.cid , cname , score
from score s , students stu , course c
where s.sid = stu.sid and s.cid = c.cid;--查询视图
select * from students_score_view;--对视图插入数据
create view students_gender_view as
select * from students where gender = '男';select * from students_gender_view;
--测试能不能插入一条性别为女的数据
insert into students_gender_view values(mysequence.nextval,'赵丽颖','女','1996-04-04','南阳市卧龙区');
--可以插入,但在视图中没有这个数据,插入到students表中去了
commit;
--添加 CHECK OPTION约束
--删除之前没加约束的视图
DROP view students_gender_view;
--创建带约束的视图
create view students_view_gender as
select * from students where gender = '男'
with check option constraint students_gender_chk;
--再一次测试能不能插入一条性别为女的数据
insert into students_view_gender values(mysequence.nextval,'凤姐','女','1996-06-04','南阳市卧龙区');
--报错 视图 WITH CHECK OPTION where 子句违规
--设置只读的视图 READ ONLY
--删除之前的视图
drop view students_view_gender;
--创建只读视图
create view students_view_gender as
select * from students where gender = '男'
with read only constraint students_gender_readonly;
--测试插入一条数据
insert into students_view_gender values(mysequence.nextval,'凤姐她哥','男','1996-12-14','南阳市卧龙区');
--报错 无法对只读视图执行 DML 操作 42399.0000 - "cannot perform a DML operation on a read-only view"