SQL语言
修改和删除表
ALTER TABLE <表名>
- ADD <新列名> <数据类型> [列约束]
- ADD <表约束>
- DROP <列名> [CASCADE|RESTRICT]
- DROP CONSTRAINT <约束> [CASCADE|RESTRICT]
- ALTER COLUMN <列名> <数据类型>
数据库安全性
- 授权GRANT
- GRANT 操作类型 ON 对象类型 对象 TO 用户 [WITH GRANT OPTION]
- 对象类型可以是:TABLE、VIEW
- WITH GRANT OPTION:授予权限后不能传播
- 例1:GRANT select ON TABLE table1 TO user1 WITH GRANT OPTION
- 例2:GRANT update(col2) ON TABLE table2 TO user2
- 收回REVOKE
- REVOKE 权限 ON 对象类型 对象 FROM 用户 [CASCADE|RESTRICT]
- 例1:REVOKE references ON view view1 FROM user1 CASCADE
- 例2:REVOKE all privileges ON view view1 FROM user1 CASCADE
- 创建用户
- CREATE USER 用户 [WITH (DBA|RESOURCE|CONNECT)]
- DBA:管理员,除基本操作外,可以创建和传播权限
- RESOURCE:可以创建基本表和视图,但不能创建模式和新用户,按实际情况可以传播权限
- CONNECT:只能登陆,按实际情况可以传播权限
数据库完整性
- 实体完整性:主码UNIQUE且NOT NULL
- 参照完整性:针对外码,分为被参照表(被REFERENCES的对象、主表)和参照表(从表)
- ==参照表改变==的违约处理:拒绝
- ==被参照表改变==的违约处理:拒绝/CASCADE/设置为NULL/设置为默认值
- ON UPDATE/DELETE NO ACTION/CASCADE/SET NULL/SET DEFAULT
- 用户自定义完整性
- 列约束:NOT NULL/UNIQUE/CHECK/PRIMARY KEY/REFERENCES 参照表(<列名>)
- 例:CHECK(col1 > value1)
- 检查与违约处理
- 表约束:CONSTRAINT/CHECK/PRIMARY KEY(<列名>,...)/FOREIGN KEY(<列名>) REFERENCES 参照表(<列名>)
- 注:
- 除了有CHECK(表达式),还有CHECK(<列名> IN/NOT IN(‘指定列名1’,‘指定列名2’...))
查询SELECT
-
where
-
<列名> IS NULL/IS NOT NULL
-
<列名> IN/NOT IN
- 后可接(‘指定列名1’,‘指定列名2’...)
- 后可接(SELECT子查询)
- <列名> EXISTS/NOT EXISTS(SELECT子查询)
- <列名> BETWEEN AND/NOT BETWEEN AND
- <列名> LIKE/NOT LIKE
- like表达式中,_表示单个字符,%表示任意个字符(可以为0个),\表示转义
- 表达式 AND 表达式 OR 表达式
- 其中AND的优先级大于OR
关系理论
范式
- 1NF:所有属性不可继续分割
- 如:若“大学”还需要继续分为“高中”和“初中”,则不满足1NF
- 2NF:1NF + 不存在非主属性对码的部分函数依赖(不冗余的码->非主属性)
- 部分函数依赖:如果{学号}->{姓名},那么{学号,班级}这个码虽然也能->{姓名},但是其中的{班级}是不必要的。即存在{姓名}对{学号,班级}的部分函数依赖
- 也就是说,2NF中,决定非主属性的码(其中的每一个主属性)必须都是必要的,不要存在多余的主属性
- 3NF:2NF + 不存在非主属性对码的传递函数依赖(不冗余的码->非主属性)
- 传递函数依赖:如果{学号}->{姓名}->{班级},那么存在{班级}对{学号}的传递函数依赖
- 也就是说,3NF中,码必须要直接决定非主属性,不要间接决定,因为这样会导致修改、插入、删除时可能无法及时更新其间接决定的属性
- BCNF:2NF + 不存在所有属性对码的部分和传递函数依赖(不冗余的码->所有属性)
- 也就是说,3NF中,码必须要直接决定所有属性,且码中的主属性不能冗余
- 如果满足2NF,快速判断是否满足BCNF:函数依赖集F中,只要左边(决定量)均包含某个码,则满足BCNF
- 4NF:BCNF + 不存在非平凡且非函数依赖的多值依赖
- 考虑一个情况{A,B,C},其中A->B是一对多(1:m),而B->C是多对多(m:n)
- 由于B和C是完全对称的,因此A->B(1:m)其实也就==间接地表明==了还存在一个A->C(1:n)
- 这种情况的缺点和传递依赖的缺点类似,为了避免,可以将{A,B,C}拆成{A,B}和{A,C},这样一个表中就不存在“间接表明”的因素了
求候选码
- 找出L、R、LR、N型属性
- 一定是主属性:L、N
- 一定不是主属性:R
-
可能是主属性:LR
-
在{L,N,LR}的所有子集中求闭包,如果闭包包含所有属性,则为候选码
求最小的函数依赖集
- 拆分右侧
-
如:A->BC拆为A->B和A->C
-
去除冗余关系
- 如:给出一个依赖集F为{AB->C,AB->D,D->C},我们删除AB->C这个关系,仅用剩下的关系来求AB的闭包,看能不能推出C,这里存在AB->D->C,因此AB->C其实是冗余的,可以直接去除
- 注意,这一步去除不一定是最优的去除方案
- 去除冗余属性
- 如:ABC->D,观察AB是否能推出C,如果能推出C,C其实是冗余属性,可以直接去除
- 注意,这一步去除不一定是最优的去除方案
模式分解
判断无损连接性I
给出一个函数依赖集F,以及分解后n个表的关系R1、R2、R3...Rn
-
表格参数
-
n行:分解后的n个关系
-
m列:总共m个属性
-
画表格
-
存在的标a(所在列),不存在的标b(所在行、列)
-
假如总共有ABCDE的属性,分解后有关系Ri(ABE),则第i行中
- 在A、B、E处分别写a1、a2、a5
- 在C、D处分别写bi3、bi4
-
更新表格
-
相同的符号分为一组:行变为最小的行
- 图中将R1、R2、R5分为一组,组中把对应b13、b23、b53全部改为了==行最小==的b13

-
一旦组中对应的符号有a:除了满足上一条规则,还要把符号全部变为a
- 如图中组内的b34、a4最终改为a3、a3

-
停止的条件
- 某一行全部是a:循环停止,满足无损连接性
- 再更新一轮后,表格没有变化:循环停止,不满足无损连接性
判断无损连接性II
给出一个函数依赖集F,以及分解后==2个表==的关系R1、R2
- 如果{R1和R2的属性交集}->{R1-R2}或者,则满足无损连接性}->{R2-R1

判断保持函数依赖
给出一个函数依赖集F,以及分解后n个表的关系R1、R2、R3...Rn
- 对于这n个关系中的n个函数依赖,如果它们的并集=原来的函数依赖集F,则满足函数依赖
保持函数依赖的分解(合成法)
- 该方法会将表转换为3NF
给出一个函数依赖集F
-
先求出总体的属性Ua
-
将原函数依赖集最小化(参见<求最小的函数依赖集>)
- N型属性分组:找出不在F中出现的属性(即N型属性),单独放入一个关系R0中,并从Ua中去掉这类属性
- 同左依赖分组:按照左部相同的原则给F的依赖分组,每组中涉及的全部属性形成一个组,单独放到一个关系Ri中(注意去重),并从Ua中去掉这组属性
- 反复进行第三步操作
保持无损连接+函数依赖的分解(合成法的补充)
-
该方法同样会将表转换为3NF
-
进行合成法,分解的关系集合为{R}
- 设原关系的码为X,若X不属于{R}且{R}不属于X,则最终关系集合为{R}$\cup$X,否则就为{R}本身(不并上X)
关系代数
基本关系操作
- 所有的操作
- 集合操作:并、差、交、笛卡尔积
- 关系操作:选择、投影、连接、除
- 5大基本操作
- 并、差、笛卡尔积(记作”并差集“)
- 选择、投影
- 除运算

E-R图
画出E-R图
- 关系和实体都可以有属性
将E-R图转换为关系模型
-
将E-R图中的每一个==实体==,都写一个关系模型R(...)
-
其中,主码选择其中一个候选码即可,主码要画下划线。
-
表示联系
以下假设存在一个关系A-R-B,A和B是实体,R是联系,并且R也有自己的属性
- 1:1联系有两个方法:
- 独立联系:将联系R也看作一个实体,写一个关系模型,注意要把A和B的主码写进去,主码选择其中一个候选码即可
- 合并联系:联系R可以==合并到任意一端(A或B)==
- 假如A是职工(职工号,姓名,年龄),R是负责(职工号,产品号)
- 那么合并A和R,就得到A‘=职工(职工号,姓名,年龄,产品号)
- 1:n联系有两个方法:
- 独立联系
- 合并联系:只能将联系合并到n端
- n:m联系z只有一个方法:
- 独立联系