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},这样一个表中就不存在“间接表明”的因素了

求候选码

  1. 找出L、R、LR、N型属性
  2. 一定是主属性:L、N
  3. 一定不是主属性:R
  4. 可能是主属性:LR

  5. 在{L,N,LR}的所有子集中求闭包,如果闭包包含所有属性,则为候选码

求最小的函数依赖集

  1. 拆分右侧
  2. 如:A->BC拆为A->B和A->C

  3. 去除冗余关系

  4. 如:给出一个依赖集F为{AB->C,AB->D,D->C},我们删除AB->C这个关系,仅用剩下的关系来求AB的闭包,看能不能推出C,这里存在AB->D->C,因此AB->C其实是冗余的,可以直接去除
  5. 注意,这一步去除不一定是最优的去除方案
  6. 去除冗余属性
  7. 如:ABC->D,观察AB是否能推出C,如果能推出C,C其实是冗余属性,可以直接去除
  8. 注意,这一步去除不一定是最优的去除方案

模式分解

判断无损连接性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

    image-20240110012858161

  • 一旦组中对应的符号有a:除了满足上一条规则,还要把符号全部变为a

    • 如图中组内的b34、a4最终改为a3、a3

    image-20240110013310280

  • 停止的条件

    • 某一行全部是a:循环停止,满足无损连接性
    • 再更新一轮后,表格没有变化:循环停止,不满足无损连接性

判断无损连接性II

给出一个函数依赖集F,以及分解后==2个表==的关系R1、R2

  • 如果{R1和R2的属性交集}->{R1-R2}或者,则满足无损连接性}->{R2-R1

image-20240110015228913

判断保持函数依赖

给出一个函数依赖集F,以及分解后n个表的关系R1、R2、R3...Rn

  • 对于这n个关系中的n个函数依赖,如果它们的并集=原来的函数依赖集F,则满足函数依赖

保持函数依赖的分解(合成法)

  • 该方法会将表转换为3NF

给出一个函数依赖集F

  1. 先求出总体的属性Ua

  2. 将原函数依赖集最小化(参见<求最小的函数依赖集>)

  3. N型属性分组:找出不在F中出现的属性(即N型属性),单独放入一个关系R0中,并从Ua中去掉这类属性
  4. 同左依赖分组:按照左部相同的原则给F的依赖分组,每组中涉及的全部属性形成一个组,单独放到一个关系Ri中(注意去重),并从Ua中去掉这组属性
  5. 反复进行第三步操作

保持无损连接+函数依赖的分解(合成法的补充)

  • 该方法同样会将表转换为3NF

  • 进行合成法,分解的关系集合为{R}

  • 设原关系的码为X,若X不属于{R}且{R}不属于X,则最终关系集合为{R}$\cup$X,否则就为{R}本身(不并上X)

关系代数

基本关系操作

  • 所有的操作
  • 集合操作:并、差、交、笛卡尔积
  • 关系操作:选择、投影、连接、
  • 5大基本操作
  • 并、差、笛卡尔积(记作”并差集“)
  • 选择、投影
  • 除运算

image-20240110154221711

E-R图

画出E-R图

  • 关系和实体都可以有属性

将E-R图转换为关系模型

参见:E-R图转化为关系模型-CSDN博客

  1. 将E-R图中的每一个==实体==,都写一个关系模型R(...)

  2. 其中,主码选择其中一个候选码即可,主码要画下划线。

  3. 表示联系

以下假设存在一个关系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只有一个方法:
    • 独立联系