文章目录
一 绪论
数据库、数据库管理系统:
数据模型:
模型是对某个对象特征的模拟和抽象。数据模型是对现实数据特征的抽象。数据模型是数据库系统的核心和基础。根据模型应用的目的可以分为:1概念模型、2逻辑模型和物理模型。
>层次模型:像一个倒立的树,结点的双亲唯一。
网状模型:允许一个以上结点无双亲,一个结点可以有多于一个的双亲。
关系模型:最重要的一种数据模型。由一组关系组成,每个关系是一张规范的二维表。
关系模式:对关系的描述,关系名(属性1,属性2,属性3)
关系的完整性约束:实体完整性、参照完整性、用户定义的完整性。
**E-R图**:实体-联系方法,概念模型的一种表示方法。
数据模型通常由:数据结构、数据操作、数据的完整性约束条件组成。
-
数据库系统的结构:
三级模式结构:
二级映像:
二 关系数据库
关系数据结构
- 关系模型中数据的逻辑结构是一张二维表。
- 笛卡尔积:
关系操作
-
查询、插入、删除、修改
查询:
-
完整性约束
- 实体完整性、参照完整性、用户定义的完整性。其中前两个必须满足,成为关系的两个不变性。
- 实体完整性(主码):
- 参照完整性(外码):
- 用户定义的完整性:
关系代数
三 关系数据库标准语言SQL
结构化查询语言(Structured Query Language)
数据定义
-
SQL的数据定义:模式定义、表定义、视图和索引定义。
模式:实际上是定义了一个命名空间,在空间中可以进一步定义表、视图、索引等。创建模式的用户需要有DBA权限。
表定义:
修改表:一个alter只能做一件事。
删除表:索引定义:
重命名:
删除:
数据查询
-
SELECT
执行顺序:from---->join on---->where---->group by---->having---->select---->distinct---->order byhaving将条件应用于group by后分的组。
order by默认asc升序,对结果排序,升序排列时空值在最后(不同系统可能实现不同)。最后执行。
order by中可以有子查询,但order by不能用在子查询中(8i开始,可以用在top-n这种子查询中select * from table1 where ID in(select top 10 ID from table1 order by score)
),因为子查询中排序后,到父查询又乱了,没意义。 -
常用查询条件:
不同的数据库对
BETWEEN...AND
操作符的处理方式是有差异的。 MYSQL/SQL Server 中的BETWEEN…AND是包括边界值的,NOT BETWEEN 是不包含边界值的。
LIKE:包含通配符,
like [0-9][0-9]
:只能取0-9之间的数字,like [^0-5]
:不包含0-5之间的数字。
-
聚集函数:只能用于select和group by的having里,where里不能用。
除
COUNT(*)
外,都过滤空值 -
GROUP BY:将查询结果按某一列或多列的值分组,值相等的为一组。分组后聚集函数姜作勇每一组,即每组都有函数值(否则聚集函数作用于整个查询结果)。
-
连接查询:
等值连接/非等值连接
自身连接:一个表可以与自己进行连接。
外连接:保留悬浮元组,inner join(内连接)、left join(左连接)、right join(右连接)、full join(全连接)
inner join只保留两张表中完全匹配的结果集。
left join会返回左表所有的行,即使在右表中没有匹配的记录。
right join会返回右表所有的行,即使在左表中没有匹配的记录。
full join返回左表和右表中所有没有匹配的行。 -
嵌套查询:
带有ALL/ANY的子查询,ALL/ANY用在子查询结果集上,表示全部/任一。
带有EXISTS谓词的子查询:(NOT EXISTS,内层返回空,则外层返回真值)
-
集合查询:将多个select的结果做集合操作。
-
临时派生表:from后面的子查询的查询结果形成的临时表,必须指定别名。
数据更新
INSERT
向表中添加数据,UPDATE
修改表数据,DELETE
删除表数据。- 插入操作:插入元组或插入子查询结果(多行数据)
不指名列名时要给每个属性赋值(空值也要明确写出来)
-
修改操作:
-
删除数据:
视图
从一个或几个基本表中导出的表,是一个虚表。数据库只存放视图定义,数据仍在基本表中。
-
创建视图:
-
删除视图:
-
查询视图:
-
更新视图:
并不是所有视图都能更新,目前,各个关系数据库管理系统一般只允许对行列子集视图(视图的列是单个基本表的子集,且保留主码)更新。
因为不是所有视图都能转化为相应基本表的更新(例如,平均值视图更新平均值,无法使基本表更新后满足平均值)。
sql库函数
四 数据库安全
保护数据库以防止不合法使用所造成的的数据泄露、更改和破坏。
安全性控制
用户身份鉴别、多层存取控制、审计、视图和数据加密。
- 存取控制:定义用户权限(授权:数据库对象+操作类型)、合法权限检查。
授权:GRANT/REVOKE
角色:角色是权限的集合,create role 角色名
。给角色授权和给用户授权一样,也可以把角色授权给用户。
五 数据库完整性
防止数据库中存在不符合语义的数据,防止数据库中存在不正确的数据。
-
实体完整性:primary key约束后,DBMS进行全表扫描检查主码是否唯一,由于全表扫描耗时,一般DBMS自动在主码上建立索引。
-
参照完整性:外码
-
用户定义的完整性:针对某一具体应用的数据必须满足的语义要求。
建表时定义:create table t{
sex char(2) check(sex in (‘男’,‘女’))
};完整性约束命名子句:对约束命名。
-
断言:更具一般性的约束,创建后,任何断言中所涉及关系的操作都会触发DBMS对断言的检查,断言不为真是拒绝执行。(例如,限制某表的数据数量)
-
默认值default、规则rule:是一种对象,可以绑定到列上,反复使用。
-
标识列identity:自动生成标识符,
identity(种子,增量)
六 数据库编程
-
游标
cursor
:当select语句的结果中包含多个元组时,使用游标可以逐个存取这些元组。是系统为用户开设的数据缓冲区。
//定义一个游标,使之对应一个select语句 declare 游标名[scroll] cursor for select语句[for update [of列表名]] open 游标名 //打开游标 //在活动集中将游标移到特定的行,并取出该行数据放到相应的变量中 fetch [next | prior | first | last | current | relative n | absolute m] 游标名 into [变量表] //取 //关闭游标,释放活动集及其所占资源。需要再使用该游标时,执行open语句 close 游标名 //删除游标,以后不能再对该游标执行open语句 deallocate游标名
-
存储过程
procedure
:一组用来实现一个任务的sql语句集。编译和优化后保寸在数据库中,存储过程只要编译一次,第一次编译之后可以直接调用。//创建 CREATE PROC[edure] procedure_name [ ; number ] [ @parameter data_type [ = default ][output], … uc1] //参数 AS sql_statement //sql语句 //调用 exec 存储过程名 参数1,参数2...
-
函数
function
:与存储过程类型,持久性存储模块,但函数必须指定返回类型。
标量函数、内嵌表值函数、多语句表值函数。//标量函数 CREATE FUNCTION func_name [@参数名 类型] returns AS BEGIN sql语句 (select @变量...) return @变量 END
-
触发器
trigger
:再执行一定操作(FOR后面的操作)时自动触发。CREATE TRIGGER trigger_name ON table FOR { INSERT | UPDATE | DELETE } AS SQL语句
七 规范化
一个好的模式不会发生插入异常、更新异常、删除异常,数据冗余尽可能少。
范式
八 数据库设计
-
需求分析、概念结构设计(E-R图)、逻辑结构设计(E-R图转二维表)、物理结构设计(存储结构和存取方法)、数据库实施(建立数据库,数据入库)、数据库运行和维护。
E-R图中,1:1的关系转化为两张表;1:n转化为两个表;n:n转化为三个表(实体两个,联系一个)
存取方法:快速存取数据库中数据的技术,索引方法(B+树,hash索引)、聚簇方法等。
-
数据字典:
索引
- 索引:
九 数据库恢复
事务
事务是用户定义的一个数据库操作系列,这些操作要么全做,要么全不做。
故障
- 事务内部的故障(可预期的、非预期的),系统故障,介质故障,计算机病毒。
可预期的是可以有程序本身处理故障,非预期的比如运算溢出、并发事务死锁而被选中撤销、违反了某些完整性限制而被终止等。
系统故障(软故障),例如CPU故障、操作系统故障、系统断电等。影响所有正在运行的事务,但不破坏数据库。恢复时要撤销(UNDO)所有未完成的事务,重做(REDO)所有已提交的事务。
介质故障(硬故障),外存故障,如磁盘损坏、磁头碰撞等。会破坏数据库。恢复时要装入数据库副本并重做所有事物。
恢复
建立冗余:数据转储,登记日志文件。
- 数据转储:
- 登记日志文件必须遵循:
十 并发控制
串行执行、交叉并行执行(单处理机)、同时并行执行(多处理机)。
-
事务是并发控制的基本单位, 事务的四个特性、脏读幻读不可重复读、隔离级别,并发控制就是要用正确的方式调度并发操作,保证事务隔离性,避免造成数据不一致性。
-
并发控制的主要技术:封锁、时间戳、乐观控制法、多版本并发控制(MVCC)
封锁
-
基本的封锁类型:排他锁(写锁)、共享锁(读锁)
若事务T对数据对象A加排他锁,则T可以对A读和写,其他事务不能对A加任何锁(即不能读取和修改A)
若T对A加共享锁,则T只能读A,不能写。其他事务可以对A加共享锁,同样只能读。 -
封锁协议:加锁的规则,何时申请、持锁时间、何时释放等。一级二级三级。
-
活锁死锁:活锁(可能发生某个事务一直等待的情况,可以用先到先服务策略解决);死锁(两个事务互相等待永远不能结束)
-
可串行化调度:
-
两段锁协议:
-
封锁的粒度:封锁对象的大小 。
多粒度封锁:一个系统同时支持多种封锁粒度供不同事务选择。
其他并发控制
-
多版本并发控制:MVCC 使用了一种不同的手段,每个连接到数据库的读者,在某个瞬间看到的是数据库的一个快照,写者写操作造成的变化在写操作完成之前(或者数据库事务提交之前)对于其他的读者来说是不可见的。
当一个 MVCC 数据库需要更一个一条数据记录的时候,它不会直接用新数据覆盖旧数据,而是将旧数据标记为过时(obsolete)并在别处增加新版本的数据。这样就会有存储多个版本的数据,但是只有一个是最新的。这种方式允许读者读取在他读之前已经存在的数据,即使这些在读的过程中半路被别人修改、删除了,也对先前正在读的用户没有影响。这种多版本的方式避免了填充删除操作在内存和磁盘存储结构造成的空洞的开销,但是需要系统周期性整理(sweep through)以真实删除老的、过时的数据。实现:MVCC 使用时间戳(TS)、递增的事务 ID(T)实现事务一致性。
MVCC 通过维护多版本数据,保证一个读事务永远不会被阻塞。