数据库总结
-
SQL语句
-
DDL(数据库定义语言)
1.1表
1.建表: create table 表名
(Sno int primary key,
Name varchar(20) not null,
Sex varchar(5),
Constraint sex_check check(sex in(‘男’,’女’)),
Foreign key(name) references 表名(name)
);
2.删表:drop table/clomun/constriant 名称 (cascade/restrict)
Restrict:不能被其他视图/表引用也不能有触发器,否则删除失败
Cascade:所有依赖该表的视图或表将一并删除
3.修改表 :alter table 表名 alter/add column 列名(数据类型)
1.2索引
-
创建:create (unique) index 索引名 on 表名(列名)
-
删除:drop index 索引名
-
修改:alter index 索引名 rename to 新索引名
1.3视图(也有带表达式的视图)
(1)创建:(可由一个或多个基本表或其他视图导出)
create view 视图名 as select...(with check option)
With check option:增删改查时自动带上谓词语句
(2)删除:drop view 视图名 (cascade)
(3)查询:select * from 视图名...
(4)增删改:(视图是虚表,对其增删改将作用在基本表上)
insert into 视图名 values(?)
update 视图名 set=? where...
delete from 视图名(where.....)
1.4触发器(只能定义在基本表上)
1.详解:create trigger 触发器名 before/after 触发事件(触发列)
on 表名 触发器类型
when(触发条件) 触发动作
2.create or replace trigger 触发器名
before/after update (of sno) on 表名 for each row/statement;
declare v1 cj.v1%type; //定义变量
Begin
If inserting then
Insert into cj.bak values(:new.sno,:old.name,v1);
End if;
End;
3.删除触发器:drop trrigger 触发器名 on 表名;
1.5储存过程
1.创建:create or replace procedure 名(参数) as SQL语句块;
Create or replace procedure 储存过程名 is
Begin
........
End 存储过程名;
Exec 储存过程名;
2.修改:alter procedure 名 rename to 新名;
Alter procedure 名 compile;//重新编译
3.删除:drop procedure 名;
2.DML(数据库操纵语言)
2.1增删改查
- 插入:insert into 表名() values();
- 删除:delete from 表名://清空表
delete from 表名 where...;//删除某一行
3.修改:update 表名 set=? where...;
4.查询:select (all/distinct) * from 表名(as 别名)
where 条件表达式
group by 列名 having 条件表达式
order by 列名 asc/desc;
A.group by 子句与having 子句一起使用
eg:select * from 表名 group by class having count(class)>40;
(1)>=ANY、!=ANY、exsit 、is null、not in、or/and/not..
(2)聚集函数:count(*)、AVG(disctinct/all 列名)、SUM()...
(3)LIKE ‘刘%’;//姓刘的
LIKE ‘刘_’;//姓刘的且名字只有两个字的
其他:2.2游标
- 声明游标->打开游标->开始过程->关闭游标->结束
- Declare cursor 游标名 is select ...
声明变量
Begin
Open 游标名;
Loop
Exit when 游标名%notfound;
Fetch 游标名 into v1,v2...;
End loop;
Close 游标名;
End;
2.3授权与收回
1.授权:grant all privileges on table 表名 to 用户名 (with grant option);
eg:grant select on table cj to public(所有用户);
With grant option:该用户可以授予其他用户该权限
2.收回:revoke 权限 on table 表名 from 用户名(cascade/restrict);
Cascade:将该用户授予其他用户的权限一并收回
3.创建用户:create user 用户名 with dba/resource/connect;
dba:超级用户,可以新建模式用户等;
Resource:创建基本表和视图;connect:只能登录数据库
4.创建角色(角色是数据库一组权限的合集)
(1)创建角色:create role 角色名;
(2)角色授权:Grant 权限 on 对象类型 对象名 to 角色名;
(3)角色授予其他角色/用户:
Grant 角色名 to 用户名/角色 (with admin option);
With admin option:可将其授予其他角色/用户
(4)收回角色权限:revoke 权限 on table 名 from 角色名;
收回用户角色:Revoke角色名 from 用户名;
-
数据库系统概述
1.发展
1.1数据库管理技术的发展:人工管理阶段->文件系统阶段->数据库系统阶段
1.2数据库发展的三个阶段:第一代数据库系统->第二代数据库系统->新一代数据库系统
2.基本概念
2.1数据(data):描述事物的符号记录
2.2数据库(db):是长期储存在计算机中、有组织的、可共享的大量数据的集合。数据库中的数据按照一定的数据模型储存、描述和组织,具有共享性、低冗余度和易扩展性,且数据独立性强
2.3数据库管理系统(DBMS):是介于应用程序与操作系统之间的一层数据管理软件,和操作系统一样是计算机基础软件,也是较为复杂的大型软件系统
2.4数据库系统(DBS):是由数据库、数据库管理系统、应用程序和数据库管理人员组成的存储、管理、处理、维护数据库的系统
3.数据库系统
3.1数据库系统的组成
(1)硬件和平台和数据库;(2)软件;(3)人员
3.2数据库系统特点
(1)数据结构化;
(2)数据共享性高、冗余度低和易扩充;
(3)数据独立性高;
A.逻辑独立性;(外模式-模式映像)
B.物理独立性;(模式-内模式映像)
(4)数据由数据库管理系统统一管理控制
A.数据的安全性保护
B.数据的完整性保护:数据的正确性、有效性、相容性
C.并发控制
D.数据库恢复
3.3数据模型
型:某一类数据结构和数据的说明;
值:是型的一个具体赋值;
1.数据模型组成要素
数据结构+数据操作+完整性约束
2.数据模型的两类
A.第一类:概念模型;
(是数据库设计人员进行数据库设计的有效工具,也是数据库设计人员与用户交流的方式。表示方法为:E-R模型)
B.第二类:逻辑模型和物理模型
3.常用的逻辑数据模型
A.层次模型(树)
B.网状模型(图)
C.关系模型
D.面向对象数据模型
3.4数据库系统的结构
1.三级模式
tips:模式是“型”的概念
(1)外模式(子模式/用户模式):描述的是数据库系统的局部逻辑结构,是数据库用户的数据视图,根据不同应用所显示的不同数据的逻辑表示。
(一个数据库有多个外模式,而一个应用只有一个外模式)
(2)模式(逻辑模式):描述的是数据库系统的全局逻辑结构,是所有用户的数据视图。(一个数据库只有一个模式)
(3)内模式(存储模式):是数据物理结构和存储的描述,数据库在计算机内部的组织方式。(一个数据库只有一个内模式)
2.两级映像
(1)外模式-模式映像:当模式改变时,只需要改变外模式-模式映像就不需要改动外模式。因为应用程序是根据外模式写的,因此应用程序也不需要修改,很好的保证了数据与程序之间的逻辑独立性(数据独立性)
(2)模式-内模式映射:当数据库的储存结构发生变化时,只需要改动模式-内模式映像就不需要改动模式,从而应用程序也不用改变。保证了数据与程序的物理独立性(数据的物理独立性)
-
关系数据库
关系数据模型(逻辑数据模型的一种)的唯一数据结构——关系
1.关系(元组的集合,一个元组就是关系的一条记录)
(1)域(D):一组具有相同数据类型的值的集合
(2)笛卡尔积:域上的一种集合运算;其中每一个元素叫(n)元组
(3)关系的定义:一组域D1×D2×...的子集就叫做在域D1,D2...上的子集,表示为R(D1,D2...)(总结:笛卡尔积结果的子集就叫关系)
(4)码、属性
设K是关系R<U,F>的一个属性/属性组(F:完全依赖,P:部分依赖)
候选码:(K->U,F;K为候选码)
关系中能够唯一标识一个元组,而其子集不能的某一属性或属性组;
主码:一个关系中有多个候选码时,人为选定一个作为主码;
(非)主属性:候选码的诸属性为主属性,非候选码的属性为非主属性
全码:一个关系中所有属性皆为候选码,则称为全码
超码:(K->U,K就是超码)(候选码+空集/其他属性->得到的集合=超码)
一个/多个属性组组成的集合,能够唯一标识一个关系中的任意一个元组
(5)关系的三种类型:a.基本表b.由查询结果得到的查询表c.由基本表或其他视图得到的视图表
2.关系模式(关系描述的集合)
(1)关系模式是型(表头),关系是值(表内容)
R(U,D,DOM,F)
R:关系名;U:该关系中属性名的集合;D:U中属性所来自的域;DOM:属性向域的映像集合;F:属性间数据的依赖关系集合
关系数据库的型也叫关系数据库模式,是对关系数据库的描述。其包括若干域的定义和在这些域上定义的若干关系模式;
关系数据库的值是这些关系模式在某一时刻对应的关系的集合也叫关系数据库
3.关系操作及关系代数
增删改查,其查询对应的有关系代数中的投影、选择、笛卡尔积...
-
投影∏(投影->列)
-
选择σ(选择->行)
-
连接
-
等值连接、自然连接区别:自然连接将属性名相同列合并了
-
连接
-
悬浮元组:自然连接时舍弃的元组;
外连接:自然连接保存悬浮元组,其属性值填NULL;
左外/右外连接:保存左边/右边的悬浮元组交左外/右边连接
3. 除
R÷S=T;
、
4.关系数据完整性约束
(1)实体完整性:主码唯一且不为空;
(2)参照完整性:属性/属性组F是关系R中的外码,它与关系S中的主码K相对应,则关系R中的F值:要么全为NULL,要么等于S中某个元组的主码值
(R:参照关系;S:被参照关系)
(3)用户自定义完整性:就是针对某一具体的关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求,如:某个属性必须取值唯一/不能为空
5.关系的规范化(范式)
函数依赖:设关系模式R<U,F>,X、Y是U的子集,对于R上的任意一个关系r,r中不可能存在两个元组在属性X上的值相等,在属性Y上的值不相等,则称X决定Y,Y函数依赖于X;
完全/部分函数依赖:关系模式R<U,F>中,若X->Y,且X的任何一个真子集X’都决定不了Y,那么Y完全函数依赖于X(F),否则就说Y部分函数依赖于X(P)
(1)1NF:关系模式R中所有属性必须是原子的,不可再分的;
存在的问题:插入异常、删除异常、修改复杂、数据冗余量大
(2)2NF:关系模式R满足1NF,且非主属性对码都是完全函数依赖
存在的问题:不能完全消除1NF存在的问题
(3)3NF:关系模式R满足2NF,且非主属性对任意码都没有传递函数依赖
存在的问题:对于插入异常、删除异常问题的消除不彻底
-
数据库系统详解
数据库特点中的第四点:数据由数据库系统统一管理控制
1.数据库系统安全性保护
2.数据系统完整性保护
3.数据库恢复技术
- 事务:是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位;
- 事务的ACID特性
- 原子性:事务所包括的诸操作要么都做要么都不做;
- 一致性:(与原子性密切相关)事务执行的结果是从一个一致性状态转换到另一个一致性状态;
- 隔离性:一个事务的内部操作及使用的数据对其他并发事务是隔离的,不能被其他事务干扰;
- 持续性:一个事务一旦提交,他对数据库的数据的修改是永久性的。
- 故障种类
- UNDO:该事务提交之前遇到故障,恢复操作叫事务撤销(UNDO)
- REDO:事务提交之后遇到故障,系统重新启动重做所有已提交的事务
4.并发控制
事务是并发控制的基本单位
-
并发操作带来的数据不一致性(破坏了事务的隔离性)
- 丢失修改:T1、T2读同一数据并修改,T2提交的结果覆盖了T1的提交结果,导致T1的提交修改结果丢失
- 不可重复读:T1第一次读的数据再读时被T2修改/删除/添加,导致两次读的不一致
- 读“脏”数据:T2读取了T1提交后又撤回的数据,导致T2读取的实际数据值与数据库中的不一致,就是脏数据
-
并发控制的技术
- 封锁
- 时间戳
- 乐观控制法
- 多版本并发控制
5.封锁
5.1封锁类型
- 排它锁(写锁/X锁):事务T对数据A加上X锁,则只有事务T可以对数据A进行读和修改,其他任何事务都无法再对数据A加上任何锁直到释放X锁;
- 共享锁(读锁/S锁):事务T对数据A加上S锁,则事务T可以读数据A但不能修改,其他书屋只能对A加S锁,直到T释放S锁。
5.2封锁协议
- 一级封锁协议:事务T对数据A进行修改必须先对A加X锁,直到事务结束才释放;
- 二级封锁协议:在一级封锁协议的基础上,事务T对数据A进行读取必须先加S锁,读完之后即可释放S锁;
- 三级封锁协议:在一级封锁协议基础上,事务T对数据A进行读取必须先加S锁,直到事务T结束才释放
- 两端锁协议:所有事务必须分两个阶段对数据加锁和解锁
第一阶段获得封锁,事务可以申请获得对任何数据上的任何锁,但不能释放锁
第二阶段释放封锁,事务可以释放任何数据项上的任何锁,但不能再申请任何锁
5.3活锁与死锁
1.活锁
事务T请求封锁数据A在等待其他事务对数据A释放锁,由于事务的调度原则T可能永远在等待,这种情形就是活锁
避免活锁的简单方法:先来先服务策略
2.死锁
事务T1封锁了A1,事务T2封锁了A2,T1申请封锁A2,T2申请封锁A1,两个事务相互等待且永远无法结束形成死锁
死锁解决办法:
- 一次封锁法:事务将需要申请封锁的数据一次性全部加锁;
- 顺序封锁法:预先对一个数据对象规定一个封锁顺序,所有事物都按照这个顺序进行封锁