一、视图:
♠ 视图 --- 称为虚表,即虚拟的表,是一组数据的逻辑表示。 视图本身并不包含任何数据,它只包含映射到基表的一个查询语句,当基表数据发生变化,视图数据也随之变化。
♠ 作用:
(1)如果需要经常执行某项复杂查询,可以基于这个复杂查询建立视图,此后查询此视图即可,简化复杂查询;
(2)视图本质上就是一条 SELECT 语句,所以当访问视图时,只能访问到所对应的 SELECT 语句中涉及到的列,对基表中的其它列起到安全和保密的作用,限制数据访问。
♠ 语法:CREATE VIEW v_table_name AS SELECT 语句
♠ 分类:
(1)简单视图 --- SELECT 语句是基于单表建立的,且不包含任何函数运算、表达式或分组函数。
(2)复杂视图 --- SELECT 语句同样是基于单表,但包含了单行函数、表达式、分组函数或 GROUP BY 子句。
(3)连接视图 --- SELECT 语句是基于多个表的。
♠ 注意:
(1)创建视图是需要权限的。例如:赋予权限 ---GRANT CREATE VIEW TO tarena
(2) 视图中对应的查询语句的字段可以添加别名,那么视图中该字段就是用别名作为字段名。
(3)当视图中的查询语句的对应字段含有函数或者表达式,那么该字段必须给别名。
(4)对视图进行 DML 操作,但是并非是对视图本身进行,而是对视图数据来源的表进行了 DML.
(5)视图看不到的字段,全部插入默认值。这里就需要注意,若视图看不到的字段中含有 NOT NULL 约束的字段,那么向视图插入数据是不会成功的。
(6)通过视图插入了一条视图看不到的数据后,就会对基础班产生“污染“。
(7)修改视图可能对基础班产生污染。
(8)删除只能删除视图看得到的数据
(9)复杂视图不允许 DML 操作
♠ 操作:
-
- 创建视图 --- CREATE VIEW v_emp_rs AS SELECT empno, ename, sal, deptno FROM emp_rs WHERE deptno = 10
- 修改视图 --- CREATE OR REPLACE VIEW v_emp_rs AS SELECT empno, ename, sal, deptno FROM emp_rs WHERE deptno = 10
- 删除视图 --- DROP VIEW view_name
♠ WITH CHECK OPTION :
作用:在 CREATE视图语句的最后添加 WITH CHECK OPTION 后,视图可以对进行 DML操作的数据进行检查,插入的数据必须视图可见,修改的数据必须保证修改后视图对其仍然可见才可以操作,避免对基表污染。
例如:CREATE VIEW v_emp_rs AS SELECT empno, ename, sal, deptno FROM emp_rs WHERE deptno = 10 WITH CHECK OPTION
♠ WITH READ ONLY :
作用:当视图设置后,该视图不允许 DML 操作。
♠ 和视图相关的数据字典:
—USER_OBJECTS
—USER_VIEWS
—USER_UPDATE_COLUMNS
例如:在数据字典 USER_OBJECTS 中查询所有视图名称
SELECT object_name FROM user_objects WHERE object_type = 'VIEW'
二、序列:
♥ 序列 --- 是一种用来生成唯一数字值的数据库对象。序列的值由 Oracel 程序按递增或递减顺序自动生成,通常用来自动产生表的主键值,是一种高效率获得唯一键值的途径。序列是独立的数据库对象,和表是独立的对应,序列并不依附于表。通常情况下,一个序列为一个表提供主键值,但是一个序列也可以为多个表提供主键值。
♥ 语法:
CREATE SQUENCE [schema.] sequence_name [START WITH i] [INCREMENT BY j]
[MAXVAULE m] [NOMAXVALUE]
[MINVALUE n] [NOMINVALUE]
[CYCLE | NOCYCLE ] [CACHE p | NOCACHE]
♥ 注意:
(1)序列的第一个序列值是 i ,步进是j 。
(2)如果 j 是整数,表示递增,如果是负数,表示递减。
(3)序列可生吃的最大值是 m ,最小值是n
(4)如果没有设置任何可选参数,序列的第一个值是 1 ,步进是1.
(5)CYCLE 表示在递增至最大值或递减至最小值之后是否重用序列。入手递减并有最大值,从最大值开始。若没有, START WITH 指定的值开始。默认是 NOCYCLE
(6)CACHE 用来指定先预取 p个数据在缓存在,以提高序列值的生成效率,默认是 20.
♥ 序列提供了两个伪列,用于向序列获取对应的数字:
-
- NEXTVAL :获取序列下一个数字,第一次使用序列时,该伪列获取的是 START WITH 指定的数字,之后则是用当前数字加上步长得到的。
例如: SELECT swq_emp_empno_rs.nextval FROM dual
-
- CURRVAL :获取序列当前数字。它必须在序列创建后,至少使用 NEXTVAL 生成过一个数字后才可以使用。
例如: SELECT swq_emp_empno_rs.currval FROM dual
例如:使用序列生成的数字作为 emp_rs 表主键的值。
INSERT INTO emp_rs (empno,ename,sal,job,deptno) values(swq_emp_empno_rs.nextval,'JACKSON',5000,'CLERK',30)
♥ UUID --- 作为主键生成方式的一种,是一个不重复的 32 位字符串。
例如:SELECT SYS_GUID() FROM dual
♥ 删除序列 --- DROP SEQUENCE sequence_name
三、索引:
♦ 索引 --- 一种允许直接访问数据表中某一数据行的树型结构,为了提高查询效率而引入,是独立于表的对象,可以存放在与表不同的表空间中。索引记录中存有索引关键字和指向表中数据的指针(地址)。
♦ 原理: B-tree 。
♦ 伪列,唯一标识一条数据记录,可理解为行地址。
♦ 语法:CREATE [UNIQUE] IDNEX index_name ON table(column[,column…])
— Index_name 表示索引名称
— Table表示表名
— Column表示列名,可以建立单列索引或重合索引
— UNIQUE表示唯一索引
例如:在EMP_RS 表的 ename列上建立索引
CREATE INDEX idx_emp_rs_ename ON emp_rs(ename)
多列索引
CREATE INDEX idx_emp_rs_job_sal ON emp_rs(job,sal)
♦ 注意:
(1)索引会自动被套用,索引也是数据库自行维护的,我们唯一需要关心的就是是否添加索引。
(2)如果经常在索引列上执行 DML 操作,需要定期重建索引,提高索引的空间利用率。
♦ 多列索引 --- CREATE INDEX idx_emp_rs_job_sal ON emp_rs(job,sal)
创建基于函数的索引 --- CREATE INDEX emp_rs_upper_idx ON emp_rs(UPPER(ename))
修改索引 --- ALTER INDEX index_name REBUILD
删除索引 --- DROP INDEX index_name
♦ 使用情况:
(1)为经常出现在 WHERE 子句中的列创建索引。
(2)为经常出现在 ORDER BY 、DISTINCT 后面的字段创建索引。如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致。
(3)为经常作为表的连接条件的列上创建索引
(4)不要在经常做 DML 操作的表上建立索引
(5)不要在小表上建立索引
(6)限制表上的索引数目,索引并不是越多越好
(7)删除很少被使用的、不合理的索引。
四、约束:
♣ 约束 --- 是在数据表上强制执行的一些数据校验规则,可以保证表中数据的完整性,保证数据间的商业逻辑
分类:
-
- 非空约束( NN ):用于确保字段值不为空
-
- (1)建表时添加非空约束
- (2)修改表时添加非空约束
- (3)采用重建表或修改表的方式取消非空约束
- 唯一性约束( UK ): 用于保护字段或者字段的组合不出现重复值,当给表的某个列定义了唯一约束条件,该列的值不允许重复,但允许是 NULL 。唯一性约束条件可以在建表同时建立,也可以在建表以后再建立
-
- 例如:在建表之后增加唯一性约束条件
ALTER TABEL employees1 ADD CONSTRAINT employees1_name_uk UNIQUE (name)
-
- 主键约束( PK ):可以用来在表中唯一的确定一行数据
-
- 例如:建表后创建主键约束条件,并自定义约束条件名称
ALTER TABLE employees1 ADD CONSTRAINT employees1_eid_pk PRIMARY KEY (eid)
-
- 外键约束( FK ):定义在两个表的字段或一个表的两个字段上,用于保证相关两个字段的关系。
-
- 例如:添加外键约束,先建表,在建表后建立外键约束条件
ALTER TABEL employees1 ADD CONSTRAINT employees1_deptno_fk FOREIGN KEY (deptno) REFERENCES dept (deptno)
-
- —检查约束(CK):用来强制在字段上的每个值都要满足Check中定义的条件,当定义了Check约束的列新增或修改数据时,数据必须符合Check约束中定义的条件
-
- 例如:员工的薪水必须大于 2000 元
ALTER TABLE employees ADD CONSTRAIT employees_salary_check CHECK (salary > 2000)