数据库复习文档
一、数据模型
信息世界中:实体,属性,域,码(键),实体型,实体集,联系
机器世界中:字段(对应属性),记录,文件
数据模型有两种 ,概念数据模型(概念模型/信息模型),基本数据模型(包括网状模型、层次模型、关系模型)
基本数据模型三个组成要素:数据结构,数据操作,数据约束条件。
关系模型中:
1. 关系:一张表
2. 元组:一行
3. 属性:一列
4. 关键字
5. 域
6. 分量:一行对应的属性的值
二、关系数据库
关系模型:
(1) 数据结构:关系
(2) 数据操作:选择、投影、连接
(3) 数据完整性:实体完整性、参照完整性、用户定义完整性
域中所包含的值的个数成为域的基数,用m表示
元组:关系表中每一行为一个元组,组成元组的每一个元素称为分量
属性:关系表中一列叫做一个属性。
候选码:如果 某一组或单个属性能唯一标识一个元组,则称其为候选码。
主码:候选码中选一个出来做主码。
全码:若关系中只有一个候选码且候选码中包含所有属性,则称为全码
主属性:候选码中包含的属性,不要求是主键中包含的。其余的叫非主属性。
外部关系键(外码):如果一个关系中的某属性不是该关系主码却是另一关系的主码,则称其为外码,外码所在的关系叫参照关系,将外码当主码的关系叫被参照关系。
数据库中关系分为三种表:
(1) 基本表:实际存在的表
(2) 查询表:查询结果对应的表
(3) 视图表:由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据。
完整性(实体完整性和参照完整性是必须存在的,用户定义完整性看具体关系需要)
(1) 实体完整性:主键不能为空或部分为空。
(2) 参照完整性:外码必须为那个被参照关系的主码的子集,也就是在外码中出现的必须在那个主码中出现。同时外码可以为空。
(3) 用户定义完整性:在具体情况下需要设置的完整性。(如成绩不能为负)
关系运算
集合运算符:∪(并运算),-(差运算),∩(交运算),×(广义笛卡儿积)。
专门的关系运算符:σ(选择),π(投影), (连接),÷(除)。
比较运算符:>(大于),≥(大于等于),<(小于),≤(小于等于),=(等于),≠(不等于)。
逻辑运算符:¬(非),∧(与),∨(或)。
若两个关系R,S具有相同的度(属性的个数),且每个属性的来自相同的域,则称这两关系是相容的,唯有相容的关系才能进行传统的集合运算(笛卡尔积除外)。
广义笛卡尔积:不论R、S属性是否有重名,若R与S做广义笛卡尔积,则结果的目(度)为两者的相加,元组是两者分别的元组个数的乘积。
连接分两种:等值连接,自然连接,不等值连接。
等值连接:将笛卡尔积中某两个属性值相等的连接起来。
自然连接:一种特殊的等值连接,两个关系中进行比较的分量必须是相同的属性组,在结果中把重复的属性列去掉。自然连接会自动将不能匹配的给直接去掉。
不等值连接:连接条件中包含有不等式。
还有外连接。如果把悬浮元组(被舍弃的元组)也保存在结果中,其他属性置为空,则叫做外连接。
只保留左边关系的悬浮元组就叫左外连接,只保留右边的就叫右外连接。
三、关系模式的规范化
如果不进行数据规范化,会产生一些问题:
(1) 数据冗余:一样的数据一直出现
(2) 插入异常:如果由于某些原因主键暂时还没有或者还没全,其他数据也不能插入。
(3) 删除异常:如果一些记录删了其他的与之无关的记录也会被跟着删掉。
(4) 更新异常:一个数据进行了修改需要将所有与该数据有关的元组的该数据全改了,容易出现错误。
函数依赖
(1).完全函数依赖
如果属性Y函数依赖于复合属性X,且不与X的任何子集函数相依赖,则称“Y完全函数依赖于X”。
例:(SNO,CNO) →SCORE
(2)部分函数依赖
(3)传递函数依赖
在关系模式中,如果X→Y(不能Y→X),Y→Z,若存在X→Z ,则称“Z传递依赖于X”。
“SNO→DEPT,DEPT→MN”,则MN传递依赖于SNO。
范式
第一范式:不可再分割
第二范式:无部分依赖
第三范式:无传递依赖
关系是元组的集合,体现为基本表,因此是不断变化的,而关系模式是相对稳定的。
四、结构化查询语句SQL
SQL:结构化查询语言。包含数据定义(DDL),数据查询,数据操纵(DML),数据控制(DCL)等多种功能。
(1) 数据定义:定义SQL模式、基本表、视图、索引等结构。
(2) 数据操纵:数据查询,数据更新(数据插入、删除、修改)
(3) 数据控制:对基本表和视图的授权、完整性规则的描述、事务控制等。
SQL语言支持数据库的三级模式结构。其中外模式对应于视图和部分基本表,模式对应于基本表,内模式对应于存储文件。元组称为行,属性称为列。
每个基本表对应一个存储文件。
视图是虚表,具有逻辑定义,并不作为一个表显式存储在数据库中。
数据定义
创建数据库
撤销数据库
创建数据表
字段名(列名)最长为128个字符。
Create table(列名 数据类型 列级完整性约束
,…………
,表级完整性约束)
数据类型(挑几个重点)
Char(n):默认1kb,不足的补空格,最大8kb。最长不超过n
Varchar(n):最大8kb,变长字符串,最长不超过n。
Text:超过8kb用这个。
Decimal和numeric是精确数字类型,都有小数和整数。整数使用int, bigint, smallint, tinyint
货币使用money(8字节)或者smallmoney(4字节)
完整性约束的基本语法格式为:
[ CONSTRAINT <约束名> ] <约束类型>
约束不指定名称时,系统会给定一个名称。
可以简写为如下图,当不给名字的时候系统自动给名字。
完整性约束:
(1) NULL/NOT NULL
(2) UNIQUE:唯一键允许为空,但是最多只能有一个空,可用于列约束或表约束
(3) Primary key:主键。定义了主键的不能再定义unique。
(4) Foreign key:外键。
(5) Check约束:检查字段所允许的范围等东西。
修改基本表
删除基本表
建立与删除索引
索引作用:加快查询速度,保证行的唯一性。索引过多会影响数据增删改的速率。
删除索引:Drop index 索引名
视图
视图是虚表,基本表中数据变化时,视图里的也会发生改变。
Select语句
Group by按某一列或某几列的值分组,值相等的为一组。
然后选出having中符合条件的元组。
Select后面的语句可以是某个属性列,也可以是表达式。
比如:select 2000-age from S
加上distinct是消除重复行。
Where的条件里有between和not between,或者直接用><也可以。不等于是<>,也可以用!=.
用来匹配字符串的要使用like。
A%B 表示以A开头B结尾的字符串,A_B表示A开头B结尾中间只有一个字符的字符串。
如果Like后面不含通配符,也就是%或者_,那么就可以直接用=代替。
当使用order by排序时,空的元素是最大的,升序ASC时排在最后,降序DESC时排在最前。
聚合函数比如count()之类的,里面也可以加distinct,表示忽略重复值。
外连接
嵌套查询|
子查询一定要跟在比较运算符之后,下图是错误的例子。
当使用all或者any来进行子查询时,不要IN了。
前面说子查询一定要在比较运算符之后,但是不一定要放在最后奥
存在量词
标准数据库支持的union(并操作)
数据更新
插入
甚至可以把子查询的结果插入进表中
数据删除
数据修改
对视图的更新
补充一点PPT没有的:触发器
Create trigger <触发器名>
Before/after <触发事件> on <表名>
Referencing new/old row as new/old row as 变量
//这里可以这么看,referencing oldrow as OLD, newrow as NEW
For each row/statement
[When <触发事件>] <触发动作体>
//最后两句实例如下
For each row
Begin
If(New.job=’教授’)
Then new.sal=4100;
End if
End
五、数据库安全访问
授权:加上with grant option可以允许传递权限
To public 是指将这个权限给所有用户。
Grant update(Sno) on …这是对某一种操作进行操作。
回收权限
最后加上cascade的话,会回收从其派生出去的权限。
创建角色并对之授权
将一个角色授权给别的角色或者用户
事务
事务性质:原子性、一致性、隔离性、持久性。
并发操作会带来三个问题:丢失修改,不可重复读,读脏数据。
读脏数据:就是事务1修改了某个数,然后事务2读取了,但是事务1又撤销了,就出错了。
并发操作有两个锁,一个写锁(排它锁,X锁),读锁(共享锁,S锁)。
有三级封锁协议。
一级封锁协议:写数据前加写锁,读数据不加锁。只能防止丢失修改。
二级封锁协议:在一级封锁协议上,读取数据需要加读锁,读完就释放。避免读脏数据。
三级封锁协议:一级封锁协议上,读数据加读锁,事务结束再释放。
死锁
数据库的恢复
备份
日志文件:可用于事务出错的回滚。
事务故障,介质故障,机器故障。
介质故障是磁盘损坏,日志文件都坏了,只能靠镜像备份之前的了。(一般是用两个数据库同时记录,一个坏了就直接用另一个)