视图、序列、索引、约束

1. 视图

? 视图定义

视图(VIEW)也被称作虚标,即虚拟的表,是一组数据的逻辑表示,其本质是对应于一条SELECT语句,结果集被赋予一个名字,即视图名字。

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

创建视图语法:


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

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

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

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

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

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

? 视图作用

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

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

? 授权创建视图

创建视图的DDL语句是CREATE VIEW,用于必须有CREATE VIEW系统权限才能创建视图。

案例:演示权限不足情况下创建视图报错如下


管理员通过DCL语句授予用户创建视图的权限,如下:


GRANT CREATE VIEW TO username;

案例:授予SCOTT创建视图权限


? 创建简单视图

案例:使用SCOTT用户创建emp的视图


CREATE VIEW v_emp

AS

SELECT empno,ename,sal,deptno

FROM emp

WHERE deptno=10;


查看视图:


DESC v_emp;

? 查询视图

案例:查询视图


SELECT * FROM v_emp;

? INSERT

视图本身并不包含数据,只是基表数据的逻辑映射。所以当对视图执行DML操作时,实际上是对基表的DML操作。对视图执行DML操作基本原则如下:

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

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

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

案例:对简单视图进行INSERT操作


INSERT INTO v_emp VALUES (1000,‘QQQ‘,5000,10);

查看视图:


SELECT * FROM v_emp;

查看基表:可以发现对基表产生了影响


SELECT * FROM emp;

? CHECK OPTION约束

语法:


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

AS subquery

[WITH CHECK OPTION];

WITH CHECK OPTION表示通过视图所做的修改,必须在视图的可见范围内:

l INSERT,新增的记录在视图仍可查看

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

l DELETE,只能删除现有视图里能看到的记录

案例:创建带有CHECK OPTION约束的视图


CREATE OR REPLACE VIEW v_emp

AS

SELECT empno id,ename name,sal salary,deptno

FROM emp

WHERE deptno=10

WITH CHECK OPTION;

? READ ONLY约束

对简单视图进行DML操作是合法的,但是不安全。如果没有在视图上执行DML操作的必要,在建立时可以声明只读来避免对基表数据的非法修改。

语法:


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

AS subquery

[WITH READ ONLY];

案例:创建带有READ ONLY约束的视图


CREATE OR REPLACE VIEW vread_emp

AS

SELECT empno,ename,sal,deptno FROM emp

WHERE deptno=10

WITH READ ONLY;

对该表进行修改测试:


DELETE FROM vread_emp WHERE ename=‘CLARK‘;

? 数据字典

和视图相关的数据字典如下:

l USER_OBJECTS

l USER_VIEWS

l USER_UPDATABLE_COLUMNS

案例:USER_OBJECTS


SELECT object_name FROM user_objects WHERE object_type=‘VIEW‘;

案例:USER_VIEWS


SELECT text FROM user_views WHERE view_name=‘V_EMP‘; --视图名字要大写

案例:USER_UPDATABLE_COLUMNS


SELECT column_name,insertable,updatable,deletable

FROM user_updatable_columns

WHERE table_name=‘V_EMP‘;

? 创建复杂视图

创建复杂视图指在子查询中包含了表达式、单行函数或分组函数的视图。此时必须为子查询中的表达式或函数定义别名。

如果不创建别名会有以下错误提示:


案例:创建一个视图把emp表的数据按部门分组,获得每个部门的平均薪水、薪水总和、最高薪水和最低薪水


CREATE VIEW vsalary_emp

AS

SELECT d.dname,AVG(e.sal) avg_sal,SUM(e.sal) sum_sal,MAX(e.sal) max_sal,MIN(sal) min_sal

FROM emp e JOIN dept d

ON e.deptno=d.deptno

GROUP BY d.dname;

SELECT * FROM vsalary_emp;

注意:复杂视图不允许DML操作,否则会报错。

当不再需要视图的定义,可以使用DROP VIEW语句删除视图。

案例:删除复杂VIEW


DROP VIEW vsalary_emp;

2. 序列

? 序列的定义

序列(SEQUENCE)是一种用来生成唯一数字的数据库对象。序列的值由Oracle程序按递增或递减顺序自动生成,通常用来自动产生表的主键值,是一种高效率获得唯一键值的途径。

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

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

? 创建序列

语法:


CREATE SEQUENCE [schema.] sequence_name

[START WITH i] [INCREMENT BY j]

[MAXVLUE m | NOMAXVALUE]

[MINVALUE n | NOMINVALUE]

[CYCLE | NOCYCLE] [CACHE p | NOCACHE]

参数含义如下:

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

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

l 如果j是整数,表示递增,j是负数,表示递减

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

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

l CYCLE表示在递增至最大值或递减至最小值之后是否继续生成序列号,默认是NOCYCLE

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

案例:创建一个序列起始数据是100,步进是10


CREATE SEQUENCE emp_seq

START WITH 100

INCREMENT BY 10;

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

先不执行NEXTVAL,直接执行CURRVAL查看效果:


SELECT emp_seq.CURRVAL FROM dual;


获取第一个值并使用序列值为EMP插入新的数据:


INSERT INTO emp(empno,ename) VALUES (emp_seq.NEXTVAL,‘SEQ1‘);

查询新数据会发现插入的empno是100:


SELECT * FROM emp WHERE ename=‘SEQ1‘;

运行一次NEXTVAL得到序列号加10,即110:


SELECT emp_seq.NEXTVAL FROM dual;

查看当前序列号:


SELECT emp_seq.CURRVAL FROM dual;

? 删除序列

语法:


DROP SEQUENCE sequence_name;

案例:删除序列emp_seq


DROP SEQUENCE emp_seq;

3. 索引

? 索引原理

索引是一种允许直接访问数据表中某一数据行的树形结构,为了提高查询效率而引入,是独立于表的对象,可以存放在与表不同的表空间(TABLESPACE)中。索引记录中存有索引关键字和指向表中数据的指针(地址)。对索引进行I/O操作比对表进行操作要少很多。

索引一旦被建立就将被Oracle系统自动维护,查询语句中不用指定使用哪个索引,是一种提高查询效率的机制。

ROWID:伪列,唯一标识一条数据记录,可理解为行地址。

? 创建索引

语法:


CREATE [UNIQUE] INDEX index_name ON table(column[,column…])

l index_name:表示索引名称

l table:表示表名

l column:表示列名,可以简历单列索引和符合索引

l UNIQUE:表示唯一索引

案例:在emp表的ename列上建立索引


CREATE INDEX idx_emp_ename ON emp(ename);

? 创建复合索引

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

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

案例:建立复合索引


CREATE INDEX idx_job_sal ON emp(job,sal);

当做下面查询时,会自动应用索引idx_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(ename));

做以下查询,会自动应用刚刚建立的索引:

SELECT * FROM emp WHERE UPPER(ename)=‘SMITH‘;

? 修改和删除索引

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

重建索引语法:


ALTER INDEX index_name REBUILD;

案例:重建索引idx_emp_ename


ALTER INDEX idx_emp_ename REBUILD;

当一个表上有不合理的索引,会导致操作性能下降,需要删除。

删除索引语法:


DROP INDEX index_name;

案例:删除idx_emp_ename


DROP INDEX idx_emp_ename;

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

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

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

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

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

l 不要在小表上建立索引

l 限制表上的索引数据,索引并不是越多越好

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

4. 约束

? 约束的作用

l 约束(CONSTRAINT),即约束条件,也称作完整性约束条件

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

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

? 约束的类型

l 非空约束(Not Null),简称NN

l 唯一性约束(Unique),简称UK

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

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

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

4.1 非空约束

? 建表时添加非空约束

非空约束用于确保字段值不为空,默认情况下,任何列都允许有空值,但业务逻辑可能会要求某些列不能取空值,当某个字段被设置了非空约束条件,这个字段中必须存在有效值。即:

u 当执行INSERT操作时,必须提供这个列的数据

u 当执行UPDATE操作时,不能给这个列的值设置为NULL

案例:建表时设置非空约束


CREATE TABLE test_emp(

id NUMBER(8) NOT NULL,

name VARCHAR2(30) NOT NULL,

salary NUMBER(8,2)

);

? 修改表时添加非空约束

可以在建表之后,通过修改表的定义,添加非空约束

案例:修改test_emp表salary列设置非空约束


ALTER TABLE test_emp MODIFY (salary NUMBER(8,2) NOT NULL);

? 取消非空约束

取消某列的非空约束,可以采用重建表或修改表的方式。

案例:修改salary列取消非空约束


ALTER TABLE test_emp MODIFY (salary NUMBER(8,2) NULL);

4.2 唯一性约束

? 唯一性约束

唯一性(Unique)约束条件用于保证字段或者字段的组合不出现重复值。当给表的某个列定义了唯一性约束条件,该列的值不允许重复,但允许是NULL值。唯一性约束条件可以在建表的时候建立,也可以在建表以后再建立。

? 添加唯一性约束

案例:建表时添加唯一性约束


CREATE TABLE emp2(

eid NUMBER(6) UNIQUE,

name VARCHAR2(30),

email VARCHAR2(50),

salary NUMBER(7,2),

hiredate DATE,

CONSTRAINT emp2_email_uk UNIQUE(email)

);

案例:建表后增加唯一性约束条件


ALTER TABLE test_emp2 ADD CONSTRAINT test_emp2_name UNIQUE(name);

如果在其它表上建立唯一性约束,则唯一性条件约束的名称不能重复,不然会出现如下错误提示:

如:执行ALTER TABLE test_emp3 ADD CONSTRAINT test_emp2_name UNIQUE(name);

注意:如果一个已存在的表,有一列已经有重复字段,再想给这个表的这一列添加唯一性约束就会报错,报错内容为:有重复关键字。

4.3 主键约束

? 主键的意义

主键(Primary Key)约束条件从功能上看相当于非空(NOT NULL)且唯一(UNIQUE)的组合。主键字段可以是单字段或多字段组合,即:在主键约束下的单字段或者多字段组合上不允许有空值,也不允许有重复值。主键可以用来在表中唯一的确定一行数据,一个表上只允许建立一个主键,而其他约束条件则没有明确的个数限制。

? 主键选取的原则

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

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

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

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

l 主键尽量建立在单列上

? 添加主键约束

案例:建表时添加主键约束


CREATE TABLE test_emp3(

id NUMBER(8) PRIMARY KEY,

name VARCHAR2(30),

salary NUMBER(8,2)

);

案例:建表后添加主键约束


ALTER TABLE test_emp4 ADD CONSTRAINT test_emp3_pk PRIMARY KEY (id);

4.4 外键约束

? 外键约束的意义

外键约束条件定义在两个表的字段或一个表的两个字段上,用于保证相关两个字段的关系。如:

dept表:主表或父表

emp表:从表或子表

外键里面的值,必须是NULL或者主键里有的值。

主键里想删除一个值,必须是外键里面没有参照的(不存在的)。

? 添加外键约束

先建表,在建表后建立外键约束条件。

案例:


错误原因:因为dept1表没有添加主键,删除两个表,重新配置外键约束,如下:


CREATE TABLE dept1(

deptno NUMBER(8) PRIMARY KEY,

loc VARCHAR2(30)

);

CREATE TABLE emp1(

id NUMBER(8),

name VARCHAR2(30),

deptno NUMBER(8)

);

ALTER TABLE emp1

ADD CONSTRAINT emp1_deptno_fk

FOREIGN KEY (deptno) REFERENCES dept1(deptno);

? 外键约束对一致性的维护

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

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

案例:增加数据


INSERT INTO dept1 VALUES(10,‘NJ‘); --dept主表中添加deptno为10

INSERT INTO emp1 VALUES(1,‘smith‘,20); --emp从表中添加数据,deptno为20

报错:违反完整约束条件


INSERT INTO emp1 VALUES(1,‘smith‘,10); --修改成10,添加成功

INSERT INTO emp1 VALUES(1,‘smith‘,NULL); --或者修改成NULL,添加成功

案例:删除数据


DELETE FROM dept1 where deptno=10; --10这个值被从表参照,无法删除

报错:


DELETE FROM emp1 WHERE deptno=10; --必须先删除从表中的参照值

DELETE FROM dept1 where deptno=10; --才可以删除主表数据成功

? 外键约束对性能的降低

如果在一个频繁DML操作的表上建立外键,每次DML操作都将导致数据库自动对外键所关联的对应表做检查,产生开销,如果已在程序中控制逻辑,这些判断将增加额外负担,可以省去。外键确定了主从表的先后生成关系,有时会影响业务逻辑。

? 关联不一定需要外键约束

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

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

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

4.5 检查约束

? 什么是检查约束

检查(Check)约束条件用来强制在字段的每个值都要满足Check中定义的条件,当定义了Check约束的列新增或修改数据时,数据必须符合Check约束中定义的条件。

? 添加检查约束


ALTER TABLE emp1

ADD CONSTRAINT emp_id_ck

CHECK(id<10);

添加数据测试


INSERT INTO emp1 VALUES(11,‘jack‘,NULL); --报错,违反检查约束条件

添加正确数据:


INSERT INTO emp1 VALUES(8,‘jack‘,NULL);

INSERT INTO emp1 VALUES(NULL,‘tom‘,NULL); --可以添加NULL值

注意:如果添加检查约束的列已有数据并且与添加的CHECK条件不一致,则检查约束添加会报错。

时间: 2024-08-05 15:34:56

视图、序列、索引、约束的相关文章

序列-索引-约束

序列-索引-约束 1.序列 序列:也是数据库对象之一,作用是生成一系列的数字,序列常与某张表的主键字段提供值使用. 序列的创建: --序列的创建 CREATE SEQUENCE SEQ_NUM_2 START WITH 1 INCREMENT BY 2 START WITH:开始的值. INCREMENT BY :步长. 序列中的函数: A:NEXTVAL(获取序列的下一个值   第一个值获取的是START WITH 后面的值是START WITH+INCREMENT 每次加步长一次 ) 例:

数据库 day60,61 Oracle入门,单行函数,多表查询,子查询,事物处理,约束,rownum分页,视图,序列,索引

1.    oracle介绍 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一.比如SilverStream就是基于数据库的一种中间件.ORACLE数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能:作为一个关系数据库,它是一个完备关系的产品:作为分布式数据库它实现了分布式处理功能.但它的所有知识,只要在一种机型上学习

视图序列索引

视图名字一般是以"V_"开头 视图在SQL语句中体现的角色与表相同,但是视图并不是一张真实存在的表,而只是对应一个 select语句的查询结果集,并将其当做表看待而已,使用视图的目的就是简化sql语句的复杂度,重用子查询,限制数据访问 视图对应的子查询中的字段若含有函数或者表达式,那么该字段必须指定别名.当师徒对应的子查询中的字段使用了别名,那么视图中该字段就用别名来命名 create view v_emp_10 as select empno,ename,sal,deptno fro

【Oracle】第三章索引视图序列

第三章索引视图序列 序列是用来生成唯一,连续的整数的数据库对象.序列是用来自动生成主键或唯一键的值. CREATE SEQUENCE  sequence_name START WITH  integer INCREMENT BY  integer MAXVALUE   integer|nomaxvalue MINVALUE    integer|nominvalue CYCLE|NOCYCLE CACHE  integer|nocache; START WITH     指要生成的第一个序列号,

oracle创建序列&amp;索引&amp;视图

---oracle学习 --oracle的管理系统学习 --oracle的数据管理学习 --oracle的用户管理 --oracle二维表管理 --oracle的其他知识 --oracle的序列,视图,索引 --oracle的分页查询 --oracle的数据库备份 --oracle的图形化界面操作 序列 1 --oracle的序列的学习 2 --创建序列 3 --使用 create sequence 序列名 4 --特点1:默认开始是没有值的,也就是指针指在了没有值的位置. 5 --特点2:序列

Oracle学习(十):视图,索引,序列号,同义词

1.知识点:可以对照下面的录屏进行阅读 视图,序列,索引,同义词 SQL> --视图:虚表 SQL> --视图的优点:简化复杂查询,限制数据访问(银行用的多),提供数据的相互独立,同样的数据可以有不同的显示方式 SQL> --第一个视图: 员工号 姓名 月薪 年薪 SQL> create view view1 2 as 3 select empno,ename,sal,sal*12 annlsal from emp; SQL> --如果显示没有权限,则需要授权,见下图1-1

T-SQL的事物、视图和索引

事物,视图和索引 技能掌握目标: 1.使用事物保证操作的完整性 2.掌握如何创建视图 3.掌握如何创建并使用索引 首先我们要讲的是事物,那么问题来了,请问大家什么事物,他有什么作用? 带来了哪几大好处?分别是什么. 答案:事物就是把多件事情当做一件事情来处理的过程.也就是大家同在一条船上,要活一起活,要over一起over !,这也就是保证了事物的一致性和完整性. 其作用是保证事物的一致性,持久性,原子性,和隔离性. 1.一致性:就是当我们需要更新多条数据的时候,保证他们一荣俱荣,一损俱损. 就

MSSQL之八 实现视图与索引

数据库开发人员经常需要提高查询的性能.SQL Server 2008允许实现索引来减少查询的执行时间.而且,你可以通过实现视图对不同用户限制数据的浏览 本章讨论如何创建和管理索引和视图.它也讨论如何实现全文索引以提高数据索引. 重点 ?  创建和管理视图 ?  创建和管理索引 预习功课 ?        创建视图的格式以及注意事项 ?        创建索引的格式以及注意事项 视图 视图是一个虚表,是从一个或者多个表或视图中导出的表,其结构和数据是建立在对表的查询基础上的. 使用视图的优点和作用

Oracle事务和对象上集(视图、索引)

一.Oracle事务·事务的含义:事务是业务上的一个逻辑单元,为了保证数据的所有操作要么全部完成,要么全部失败.1.事务的开始是从一条SQL语句开始,结束于下面的几种情况:1)显示提交:输入commit指令,事务完成提交2)显示回滚:输入rollback指令,未提交的事务丢掉,回滚到事务开始时的状态.3)DDL语句:即create.drop等语句,这些语句会使事务自动隐式提交4)结束程序:输入exit退出数据库,则自动提交事务:或者意外终止.出现程序崩溃,则事务自动回滚.2.事务的特点-ACID

事务、视图和索引

今天我们学习了事务.视图和索引!!这是一个很神奇的东西!我们先来说说最神奇的事务吧,什么叫事务呢?事务是一个不可分割的整体,事务中的多个执行过程,同生共死.要么都执行成功,要么都执行失败.(一荣俱荣,一损俱损) 事务有4个神奇的特性: ACID原则 原子性(Atomicity ) 一致性( Consistency ) 隔离性( Isolation) :两个事务之间 永久性(Durabilily) 事务分类 显式事务;自己写的事务都是显式事务 隐式事务 自动提交事务 视图! 如何创建视图 Crea