视图、序列、索引、约束

版权声明:转载请标明出处,否则会依法追究其责任 https://blog.csdn.net/qq_41204714/article/details/82777162

视图

视图(VIEW)也被称作虚表,即虚拟的表,是一组数据的逻辑表示。

视图对应于一条SELECT语句,结果集被赋予一个名字,即视图名字。

         视图本身并不包含任何数据,它只包含映射到基表的一个查询语句,当基表数据发生变化,视图数据也随之变化。

语法:

         CREATE [OR REPLACE]  VIEW  view_name[(alias[,alias…])]  AS  subquery;

·视图创建后,可以像操作表一样操作视图,主要是查询

·Subquery是SELECT查询语句,对应的表被称为基表

·根据视图所对应的子查询种类分为几种类型:

         --SELECT语句是基于单表建立的,且不包含任何函数运算、表达式或分组函数,叫做简单视图,此时视图是基表的子集。

         --SELECT语句同样是基于单表,但包含了单行函数、表达式、分组函数或GROUP BY子句,叫做复杂视图。

         --SELECT语句是基于多个表的,叫做连接视图。

 

视图的作用:

         ·如果需要经常执行某项复杂查询,可以基于这个复杂查询建立视图,此后查询此视图即可,简化复杂查询

         ·视图本质上就是一条SELECT语句,所以当访问视图时,只能访问到所对应的SELECT语句中涉及到的列,对基表中的其他列起到安全和保密的作用,限制数据访问

 

授权创建视图

         ·创建视图的语句是CREATE VIEW,用户必须拥有CREATE VIEW系统权限,才能创建视图,如果没有权限,会显示权限不足。管理员可以通过DCL语句授予用户创建视图的权限:

         GRANT CREATE VIEW TO 用户名;

 

对视图进行DML操作

·视图本身并不包含数据,只是基表数据的逻辑映射

·当对视图执行DML操作时,实际上是对基表的DML操作

·对视图执行DML操作的基本原则:

---简单视图能够执行DML操作,下列情况除外:在基表中定义了非空列,但简单视图对应的SELECT语句并没有包含这个非空列,导致这个非空列对视图不可见,这时无法对视图执行INSERT操作。

---DELETE操作时,只能删除现有视图里能查到的记录。

---如果视图定义中包含了函数、表达式、分组语句、DISTINCT关键字或ROWNUM伪列,不允许执行DML操作。

---DML操作不能违反基表的约束条件。

 

创建具有CHECK OPTION约束的视图

语法:CREATE[OR REPLACE]  VIEW  view_name[(alias[,alias…])] 

AS  Subquery  WITH CHECK OPTION;

WITH CHECK OPTION语句表示:通过视图所做的修改。

假设INSERT,新增的记录在视图仍可查看。

假设UPDATE,修改后的结果必须能通过视图查看到。

 

创建具有READ ONLY约束的视图

语法:CREATE[OR REPLACE]  VIEW  view_name[(alias[,alias…])] 

                   AS Subquery WITH READ ONLY;

·对简单视图进行DML操作是合法的,但是不安全。

·如果没有在视图上执行DML操作的必要,在建立视图时声明为只读来避免这种情况,保证视图对应的基表数据不会被非法修改。

 

通过查询user_views获取相关信息

·和视图相关的数据字典

---USER_OBJECTS

---USER_VIEWS

---USER_UPDATE_COLUMNS

·在数据字典USER_OBJECTS中查询所有视图名称

SELECT object_name FROM user_objects WHERE object_type =’VIEW’;

 

创建复杂视图

·复杂视图指在子查询中包含了表达式、单行函数或分组函数的视图。

·必须为子查询中的表达式或函数定义别名。

·复杂视图不允许DML操作。

 

序列

·序列是一种用来生成唯一数字值的数据库对象。

·序列的值由Oracle程序按递增或递减顺序自动生成,通常来自动产生表的主键值,是一种高效率获得唯一键值的途径。

·序列是独立的数据库对象,和表是独立的对象,序列并不依附于表。

·通常情况下,一个序列为一个表提供主键值,但一个序列也可以为多个表提供主键值。

创建序列

CREATE  SEQUENCE [schema.] sequence_name

[START  WITH  i][INCREMENT  BY  j]

[MAXVALUE  m|NOMAXVALUE]

[MINVALUE  n|NOMINVALUE]

[CYCLE|NOCYCLE][CACHE  p|NOCACHE]

·sequence_name是序列名,将创建在schema方案下

·序列的第一个序列值是i,步进是j

·如果j是正数,表示递增,如果是负数,表示递减

·序列可生成的最大值是m,最小值是n

·如果没有设置任何可选参数,序列的第一个值是1,步进是1

·CYCLE表示在递增至最大值或递减至最小值之后是否重用序列。若是递减并有最大值,从最大值开始。若是递增并有最小值,从最小值开始。若没有从START WITH指定的值开始。默认是NOCYCLE

·CACHE用来指定先预取p个数据在缓存中,以提高序列值的生成效率,默认是20

 

使用序列

·序列中有两个伪列

---NEXTVAL:获取序列的下个值

---CURRVAL:获取序列的当前值

·当序列创建之后,必须先执行一次NEXTVAL,之后才能使用CURRVAL

 

删除序列

·语法:DROP  SEQUENCE  sequence_name;

索引

·索引是一种允许直接访问数据表中某一数据行的树型结构,为了提高查询效率而引入,是独立于表的对象,可以存放在与表不同的表空间(TABLESPACE)中

·索引记录中存有索引关键字指向表中数据的指针(地址)

·对索引进行的I/O操作比对标进行操作要少很多

·索引一旦被建立就被Oracle系统自动维护,查询语句中不用指定使用哪个索引

·索引是一种提高查询效率的机制

创建索引

·语法:

CREATE [UNIQUE] INDEX index_name

  ON table(column[,column…]);

---index_name表示索引名称

---table表示表名

---column表示列名,可以建立单列索引或复合索引

---UNIQUE表示唯一索引

---注:索引中出现的列都是在查询中where子句中经常出现的列

复合索引也叫作多列索引,是基于多个列的索引

·如果经常在ORDER BY子句中使用job和sal作为排序依据,可以建立复合索引;

CREATE  INDEX  idx_emp_job_sal  ON  emp(job,sal)

·当做下面的查询时,会自动应用索引idx_emp_job_sal:

SELECT  empno,ename,sal,job  FROM  emp  ORDER BY  job,sal;

 

创建基于函数的索引

·如果需要在emp表的ename列上执行大小写无关搜索,可以在此列建立一个基于UPPER函数的索引:

CREATE  INDEX  emp_ename_upper_idx  ON emp(Upper(uname));

 

修改和删除索引

·如果经常在索引列上执行DML操作,需要定期重建索引,提高索引的空间利用率;

         ALTER  INDEX  index_name  REBUILD;

·当一个表上有不合理的索引,会导致操作性能下降,删除索引的语法:

         DROP  INDEX  index_name;

 

合理使用索引提升查询效率

·为经常出现在WHERE子句中的列创建索引

·为经常出现在ORDER BY、DISTINCT后面的字段建立索引。如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致

·为经常作为表的连接条件的列上创建索引

·不要在经常做DML操作的表上建立索引

·不要在小表上建立索引

·限制表上的索引数目,索引并不是越多越好

·删除很少被使用的、不合理的索引

 

约束

作用:

·约束(CONSTRAINT)的全称是约束条件,也称作完整性约束条件

·约束是在数据表上强制执行的一些数据校验规则,当执行DML操作时,数据必须符合这些规则,如果不符合则无法执行

·约束条件可以保证表中数据的完整性,保证数据间的商业逻辑

 

约束条件包括:

---非空约束(Not Null),简称NN(列级约束)

 

---唯一性约束(Unique),简称UK(列级约束、表级约束)

·唯一性(Unique)约束条件用于保证字段或者字段的组合不出现重复值

·当给表的某个列定义了唯一性约束,该列的值不允许重复,但允许是NULL值

·唯一性约束条件可以在建表同时建立,也可以在建表以后再建立

 

---主键约束(Primary Key),简称PK

·主键(Primary Key)约束条件从功能上看相当于非空(NOT NULL)且唯一(UNIQUE)的组合

·主键字段可以是单字段或多字段组合,即:在主键约束下的单字段或者多字段组合上不允许有空值,也不允许有重复值

·主键可以用来在表中唯一的确定一行数据

·一个表上只允许建立一个主键,而其他约束条件则没有明确的个数限制

主键选取的原则:

·主键应是对系统无意义的数据

·永远也不要更新主键,让主键除了唯一标识一行之外,再无其他的用途

·主键不应包含动态变化的数据,如时间戳

·主键应自动生成,不要人为干预,以免使它带有除了唯一标识一行以外的意义

·主键尽量建立在单列上

 

---外键约束(Foreign Key),简称FK

·意义:定义在两个表的字段或一个表的两个字段上,用于保证相关两个字段的关系

外键约束对唯一性的维护

·从表上定义的外键的列值,必须从主表被参照的列值中选取,或者为NULL

·当主表参照列的值被从表参照时,主表的该行记录不允许被删除

外键约束对性能的降低

·如果在一个频繁DML操作的表上建立外键,每次DML操作,都将导致数据库自动对外键所关联的对应表作检查,产生开销,如果已在程序中控制逻辑,这些判断将增加额外负担,可以省去

·外键确定了主从表的先后生成关系,有时会影响业务逻辑

关联不一定需要外键约束

·保证数据完整性可由程序或触发器控制

·简化开发,维护数据时不用考虑外键约束

·大量数据DML操作时不需要考虑外键耗费时间                         

 

---检查约束(Check),简称CK

·检查(Check)约束条件用来强制在字段上的每个值都要满足Check中定义的条件

·当定义了Check约束的列新增或修改数据时,数据必须符合Check约束中定义的条件

猜你喜欢

转载自blog.csdn.net/qq_41204714/article/details/82777162