视图、序列、索引

来源:互联网 发布:ios 去掉数组小括号 编辑:程序博客网 时间:2024/06/16 23:44

视图

视图也被称为虚拟表或虚表,是一组数据的逻辑表示 ,视图对应于一条select语句,结果集被赋予一共名字,及视图名字
视图本身并不包含任何数据,只包含映射到基表的一个查询语句,也就是基表的数据发生变化,视图数据也随之发生变化
视图创建后,可以像操作表一样操作视图,一般用于查询

视图的分类

简单视图:基于单表建立的,且不包含任何函数运算、表达式或分组函数
复杂视图:包含了单行函数、表达式、分组函数,创建时编写为表达式,单行函数分组函数定义别名
链接视图:基于多表的建立的
视图作用:
需要经常执行某项复杂的查询,可以根据这个复杂的查询建立视图
视图的本质就是一条select语句,所以访问视图只能访问到select语句中对应到的列,对基表的其他列是保密和安全的。
语法:create view viewName AS (查询语句):注意创建视图,需要相应的权限:grant create view to 用户;
   create or replace view viewName AS(新的select语句):修改现有存在视图的select语句
   desc viewName:查看视图结构
注意:
1:查询时是以创建的试图的列明查询。
2:视图本身不包含数据,只是基表的逻辑映射,故操作DML时,实际是对基表操作
3:执行insert操作时,基表的非空列必须在视图内,不在则不能执行insert操作。如果视图包含函数,表达式,分组语句,distinct或rownum伪劣,也不能执行DML操作
4:dml操作不能违反约束操作
5:复杂视图不允许DML操作

具有check option约束的视图

create [or replace] view viewName  AS (查询语句) [with check option],表示对视图所做的修改,必须在视图可见范围内
insert在视图认可查看,update操作,修改后的结果必须能通过视图查看,delete操作只能删除现有视图能查到的记录

具有read only约束的视图

对简单的视图做DML操作是合法的,但不安全
故可以创建只读来避免这种情况
语法:create [or replace] view viewName AS (查询语句) [with read only]

和视图相关的数据字典

user_objects:查询到所有视图的名称
user_views:可查询到具体视图名相关信息
user_update_columns:可查询到某视图的相关信息
删除视图:drop view viewName,虽然视图是数据字典中的独立对象,但是视图是基表的一个查询定义,故删除视图不会导致基表数据丢失

序列

序列是用来生成唯一数字值的数据库对象,有oracle程序按递增或递减的顺序自动生成,通常用来生成主键。序列是独立的数据库对象,和表是对立对象,并不依附于基表
通常一个序列为一个表提供主键值,但也可为多个表提供

创建序列

create sequence sequenceName  [start with i ] [increment by j ] [maxvalue m | nomaxvalue] [minvalue m | nominvalue] [cycle | nocycle] [cache p | nocache]
序列第一个值是i,步进为j,j为负数,为递减,为正数表示递增
m表示最大值,或最小值
cycle表示递增到最大或递减到最小是否继续生产序列号,默认是nocycle
cache,预设p个数据在缓存中,以提高生产序列的效率

用法

序列的两个伪劣:nextval:获取下个值。currval:获取序列当前值
创建序列后必须先执行一次nextval,之后才能使用currval
获取序列第一个值如:select seqName from dual;在执行 insert into tableName (col1,col2....) values (seqName.nextval, 值2.。。。)
通过select seqName.currval from dual 查询当前序列值
注意:多执行一次select seqName from dual;则浪费一个序列值,而currval则不会导致序列的递增。
删除序列:drop sequence seqName;

索引

索引是运行直接访问数据表某一行数据的树型结构,为提高查询效率引入,独立于表的对象,可存放在与表不同结构的表空间
索引记录中存在索引关键字和指向表中数据的指针(地址)
对索引进行I/O操作比对表操作要少一些
索引一旦被创建就被oracle系统自动维护,查询语句不用指定使用哪个索引【自动查找产检的索引列】
1:创建索引:create [unique] index indexName on table [col1,col2...]
unique:表示唯一索引
复合索引:基于多个列的索引,也叫多列索引
当对基表做查询时,会自动应用索引。
2:修改索引:alert index indexName rebuild;
如果经常在索引列上进行DML操作,需要定期重建索引,提高索引的空间利用率
3:删除索引:drop index indexName
当有不合理的索引,会导致索引性能下降,删除索引

合理创建索引

经常出现在weher子句中的列
经常出现在order by、distinct。如果是复合索引,在字段顺序要和关键子后面的字段顺序一致
经常昨晚表的连接条件的列
不要在经常多DML操作的表上建立
不要在小表上建立
限制索引数目,不是越多越好
删除很少使用的,不合理的索引

约束

not  null:非空约束
unique:唯一约束
primary key:主键约束
foreign key:外键约束
check:检查约束

创建约束的方法:

非空约束:列级约束:在字段后加 not null,表级约束:在列上加(列 类型 constraint 表_列_nn not null)
添加非空约束:alter table 表 modify (列 类型 not null);
删除非空约束:alter table 表 modify (列 类型 null);
唯一约束:列级唯一:字段后见 unique,表级约束:最后加(constraint 表_列_uk unique(列))
添加唯一约束:alter table 表 add constraint 表_列_uk unique(列)
删除唯一约束:在列上加primary key
添加主键约束:alter table 表 add constraint 表_列_pk primary key (列)
外键约束:在子表上加外键约束,是在表创建后添加
条件外键约束:alter table 子表 add constraint 子表_父表_fk foreign key (子表列) references 父表(父表列)
检查约束:在创建表后添加
添加查查约束:alter table 表 add constraint 表_列_check check(列>值):表示列的值必须大于值才能进行DML操作
注意:
1:主键约束的主键应该对系统毫无意义并唯一
2:主键不应包含动态变化的数据,如时间戳
3:主键并应认为干扰,并尽量建在单列上
4:外键约束是在两个表的字段上
5:外键上的值必须能在主表中选取,但从表的列在主表上存在,则主表的改行记录不允许被删除
6:当一个有外键的表频繁做DML操作时,都会导致数据库自动对外键所关联的主表做检查,产生相应的开销,如果在逻辑中做了相应逻辑控制,则这些判断可以省去
7:关联不一定需要外键,可以用程序或触发器控制
8:新增或更改数据时,数据必须满足check约束中定义的条件
原创粉丝点击