一、数据完整性
1.含义:存储在数据库中的所有数据值均正确的状态。如果数据库中存储有不正确的数据值,则该数据库称为已丧失数据完整性。
2.分类:数据完整性是指数据的精确性(Accuracy) 和可靠性(Reliability)。它是应防止数据库中存在不符合语义规定的数据3.和防止因错误信息的输入输出造成无效操作或错误信息而提出的。
3.方式:数据库采用多种方法来保证数据完整性,包括外键、约束、规则和触发器。系统很好地处理了这四者的关系,并针对不同的具体情况用不同的方法进行,相互交叉使用,相补缺点。
二、Sql语言的分类
DML(数据操纵语言)包括:insert(插入)、update(更新)、delete(删除)、select(查询)
DDL(数据定义语言)包括:create(创建)、alter(修改)、drop(删除)
DCL (数据控制语言) 包括:grant(授权)、rollback(回滚)、commit(提交)
三、事务
1.定义:事务是指作为单个逻辑工作单元执行的一组相关操作。
2.作用:保证数据的安全有效。
3.特点:ACID
原子性(Atomic):事务中所有数据的修改,要么全部执行,要么全部不执行。
一致性(Consistence):事务完成时,要使所有所有的数据都保持一致的状态,换言之:通过事务进行的所有数据修改,必须在所有相关的表中得到反映。
隔离性(Isolation):事务应该在另一个事务对数据的修改前或者修改后进行访问。
持久性(Durability):保证事务对数据库的修改是持久有效的,即使发生系统故障,也不应该丢失。
4.事务产生的问题:数据异常
脏读(Dirty Read):事务T1更新了一行数据,还没有提交所做的修改,T2读取更新后的数据,T1回滚,T2读取的数据无效,这种数据称为脏读数据。
不可重复读(UNrepeatable Read):事务T1读取一行数据,T2修改了T1刚刚读取的记录,T1再次查询,发现与第一次读取的记录不相同,称为不可重复读。
幻读(Phantom Read):事务T1读取一条带WHERE条件的语句,返回结果集,T2插入一条新纪录,恰好也是T1的WHERE条件,T1再次查询,结果集中又看到T2的记录,新纪录就叫做幻读。
5.衍生知识:事务的隔离级别
脏读 | 不可重复读 | 幻读 | |
READ_UNCOMMITTED(读未提交) | √ | √ | √ |
READ_COMMITTED(读提交) | × | √ | √ |
REPEATABLE_READ(可重读) | × | × | √ |
SERIALIZABLE(可串行化) | × | × | × |
四、同义词
就是给数据库对象你个别名
五、视图
1.定义:预定义的查询,作为表一样的查询使用,是一张虚拟表
2.优点:
对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。
用户通过简单的查询可以从复杂查询中得到结果。
维护数据的独立性,试图可从多个表检索数据。
对于相同的数据可产生不同的视图。
3.视图的创建:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
/*
OR REPLACE:若所创建的试图已经存在,则替换旧视图;
FORCE:不管基表是否存在ORACLE都会自动创建该视图
(即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表创建成功后,视图才能正常使用);
NOFORCE:如果基表不存在,无法创建视图,该项是默认选项(只有基表都存在ORACLE才会创建该视图)。
alias:为视图产生的列定义的别名;
subquery:一条完整的SELECT语句,可以在该语句中定义别名;
WITH CHECK OPTION:插入或修改的数据行必须满足视图定义的约束;
WITH READ ONLY:默认可以通过视图对基表执行增删改操作,但是有很多在基表上的限制
(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行insert操作),
WITH READ ONLY说明视图是只读视图,不能通过该视图进行增删改操作。
现实开发中,基本上不通过视图对表中的数据进行增删改操作。
*/
六、触发器
-- 触发器的语法
create [or replace] tigger 触发器名 触发时间 触发事件
on 表名
[for each row]
begin
pl/sql语句
end
--其中:
/*
触发器名:触发器对象的名称。由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。
触发时间:指明触发器何时执行,该值可取:
before:表示在数据库动作之前触发器执行;
after:表示在数据库动作之后触发器执行。
触发事件:指明哪些数据库动作会触发此触发器:
insert:数据库插入会触发此触发器;
update:数据库修改会触发此触发器;
delete:数据库删除会触发此触发器。
表 名:数据库触发器所在的表。
for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。
*/
七、序列
定义:oracle中实现增长的对象
用法:
-- 1.创建表
create table sequence_table_test1(
id number(20) NOT NULL primary key,-- 主键,自动增加
name varchar2(20));
-- 2.序列的创建
/*序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。不占用磁盘空间,占用内存。
其主要用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值。*/
--例:
create sequence sequence_name
[start with num] --定义序列的初始值(即产生的第一个值),默认为1。
[increment by num] --定义序列的步长,如果省略,则默认为1,如果出现负值,则代表Oracle序列的值是按照此步长递减的。
[maxvalue num|nomaxvalue] --定义序列生成器能产生的最大值。选项NOMAXVALUE是默认选项,代表没有最大值定义,这时对于递增Oracle序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。
[minvalue num|nominvalue] --定义序列生成器能产生的最小值。选项NOMAXVALUE是默认选项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是?10的26次方;对于递增序列,最小值是1。
[cycle|nocycle] --序列生成器的值达到限制值后是否循环。
[cache num|nocache] --定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。
--例:
Create Sequence sequence_sequence_test1
Increment by 1 -- 每次加几个
start with 1 -- 从1开始计数
nomaxvalue -- 不设置最大值。如果要设置最大值:maxvalue 9999
nocycle -- 一直累加,不循环
cache 10;
-- 3.序列的使用
-- 创建触发器
Create trigger sequence_trigger_test1 before
insert on sequence_table_test1 for each row -- 对每一行都检测是否触发
begin
select sequence_sequence_test1.nextval into:New.id from dual;
end;
-- 4.序列的测试
insert into sequence_table_test1(name) values('lgb');
八、索引
对数据库表中的某些列进行排序,便于提高查询效率
九、存储函数和存储过程
不同点:是否用return语句返回值。存储函数一定要用return返回值。存储过程不可以通过return语句返回函数值。
十、分页
Oracle中使用rownum来进行分页,这个是效率最好的分页方式
select * from
(select rownum r,empno from emp where rownum <=10)
where r>5;