SQL 复习

复习策略:
看网络资料的数据库复习
弄懂知识点,然后做一下里面的题

SQL笔记

第三章 SQL

熟练编写 sql 语句,创建、删除语句也要看,数据类型

第四章

◼ Join Expressions(连接表达式)
◼ Views 视图
◼ Transactions
◼ Integrity Constraints
◼ SQL Data Types and Schemas
◼ Authorization
◼ Security in SQL

Join 参见 sql 的总结,natural join,inner join 等

第五章 高级 SQL

这章期中没考

使用程序设计语言访问数据库
通过两种方式从通用编程语言访问 SQL:
动态 SQL:通过函数或方法
嵌入式 SQL:在编译时全部确定

JDBC 标准定义了 java 和 SQL 的 API

第六章 关系代数

SQL 形式化语言——关系代数
重点是如何将sql语句转化为关系代数

选择运算 select operation σ
选择关系instructor中属于物理系的元组:
σ dept_name=“Physics”(instructor)
选择关系 instructor 中 salary>90000 的元组:
σ salary>90000 (instructor)
⋀ (and), ⋁ (or), (not)

投影运算 project operation ∏
用于选择表中想要的属性
∏ name, salary (instructor)
找出物理系中所有教师的名字:
∏ name (σ dept_name=“Physic’ (instructor))

并运算 union operation ∪
找出开设在 2009 年球季或者 2010 年春季学期,或者二者皆开的课程集合
∏course_id (σ semester=“Fall” Λ year=2009 (section)) ∪
∏course_id (σ semester=“Spring” Λ year=2010 (section))

集合差运算 Set Difference Operation -
找出开设在 2009 年秋季但不开设在 2010 年春季的课程
∏course_id (σ semester=“Fall”Λ year=2009(section))-
∏course_id (σ semester=“Spring”Λ year=2010(section))

笛卡尔积运算 Cartesian-Product Operation x
∏ name (σ dept_name=“Physic’ (instructor x teaches))

更名运算 Rename Operation
选出 instructor 中 salary 最高的:
σ instructor.salary < d.salary (instructor ╳ ρ d(instructor))

select T.salary
from instructor T, instructor S
where T.salary > S.salary

第七章 E-R 图

非ER关系中,两个实体关联,每个实体中可能会有对方实体的主码,从而产生冗余
在ER关系中,如果一个实体的属性是另一个实体的主码,则删除该属性。二者的关联会在联系集里表达。(P183)

双线表示一对一关系,实体集唯一对应关系集

大学实体集及属性(P154 输入183)

大学 E-R 图(P159 输入188)

E-R 图图形含义(P172 输入 201)

练习题(P179 输入208)

弱实体集:如果保留某些属性,则在和别的集合关联时,会造成属性的冗余。所以我们选择删掉该属性。但删掉后,当前剩余的属性就不能保证唯一标识元素。这样的实体集称为弱实体集。弱实体集必须与强实体集关联才有意义。

E-R 图中,双线表示有且仅有一个相关的对象
箭头:A → B 表明 每个 A 至多有一个 B

构造关系表时,如果有多个候选键,最好选取数值型(int, float)候选键作为关系表主键,便于提高基于主键的查询速度
—不要选字符串型属性,如varchar、datetime
—e.g. studentname, instructorName

双菱形表示弱实体集的标识性联系集

构建 E-R 图步骤
从关系集入手,分别判断其关联的两个实体集的对应关系。看是采用双线、箭头,还是单线。
判断弱实体集:看关联的两个实体集的属性,是否有相同的,如果有,去掉其中一个的属性,将其变为弱实体集,然后将关系变为双菱形。

第八章 关系数据库的设计

◼ Features of Good Relational Design
◼ Atomic Domains and First Normal Form
◼ Decomposition Using Functional Dependencies
◼ Functional Dependency Theory
◼ Algorithms for Functional Dependencies

好的关系设计的特点
取决于E-R图质量
是否有重复,是否可以很好的表示所有信息
删除和更新问题

原子性和第一范式

第十章 数据存储和文件结构

◼ File organization (at physical level, §10.5)
◼ Organization of records in files (at logical level, §10.6 ),
i.e. file structures
◼ Data-dictionary Storage (§10.7)
◼ Data Buffer (§10.8)

10.5 文件组织

第十一章 索引

搜索码:用于在文件中查找记录的属性或属性集
索引
什么是
聚集索引 clustering index ,非聚集索引,稠密索引,稀疏索引,

每个索引对数据增删改查是否有影响,

索引创建在搜索码(属性)上面,可提高检索速度
要会说明原因

在除了查询之外,delete update insert 时如何提高效率,搜索码
索引也有空间、时间开销,增加/删除,所以不一定能对增加删除修改起到提高效率的作用
也可能拖慢速度

on which attributes the indices can be further defined to speed up the query? 在哪里添加索引会继续加快查找?
1.找语句中频繁使用的元素
2.找where后面的元素
3.找join on后面的元素
例:
select branch_city, sum(amount)
from branch inner join loan on branch_name
where assets>1000
group by branch_city
1.branch_city加索引
2.assets加索引
3.branch_name加索引

Give a SQL statement to define a composite index on combined search key(branch_name, amount) on the table loan. 创建索引
语法:
create index branch_name_amount_index on loan(branch_name, amount);
create index 索引名 on 表名(属性名)

Can this index be efficiently used for the following query, and why? 是否可以提升查询速度?
答题角度:看被索引的对象在什么关键词后面。
比如在where后/经常被查询使用

第十二章 查询处理

熟悉关系代数的表示
启发式查询树优化实例
B站讲解 数据库语法树优化

步骤
1、写出关系代数表达式
2、画出查询树
3、选择关系下移
4、投影下移,注意投影要在选择关系之上;每个自然连接前面必须有投影

函数依赖

求属性集闭包(AB+)
求属性集闭包

List all the candidate keys of R. 求候选键
1.即只出现在F箭头左边的一定是候选码
上例中,A和C只出现在箭头左边,我们用闭包计算可以得到U,则(AC)是该关系的候选码
注:除了候选键,其余都是非主属性
2.可以推出所有的字母的是候选键

What is the highest normal form of R 关系R的最高范式是什么(判断是第几范式)
如何判断范式(1NF、2NF、3NF、BCNF)
1.求候选码。候选键可以是连着的几个字母,而主属性是分开的独立字母;除了主属性之外的字母都是非主属性
2.如果F中,存在左部没有候选码的关系,则有非平凡FD,则不是BCNF
3.如果上述关系中,右部都是主属性,则为3NF
4.如果任何主属性都不能推出非主属性,则为2NF
5.否则为1NF

lossless-join decomposition 判断无损分解
无损分解讲解

Compute the canonical cover Fc 求最小函数依赖
知乎讲解
1.将右部都化为单一字母
2.去掉左边多余属性,具体方法:只需关注非单属性,求左侧的闭包,但不要加上左边推出的字母,比如 DG->C:判断(DG)+ = DG,不要再把C加上再推了。观察得到的闭包,如果闭包含有右侧推出的字母,则删除;否则保留。DG不含C,则保留。
3.剩余的单个关系,判断是否存在形如 D->C, C->A, D->A 这样的,删除 D->A 即可
综上可得出最小函数依赖

Give a lossless-join and dependency-preserving decomposition of R into 3NF
在最小函数依赖上进行构建

事务

concurrent transactions:并发事务
画优先图 precedence graph 并 判断是否可串行化 serializable:油管清晰讲解
关注三对关系:R->W,W->R,W->W

是否是可恢复调度? Is S a recoverable schedule, and why?
对于可恢复调度,如果一个调度从另外一个调度的结果中读取数据,那么它必须在另外以后调度的commit之后commit。
不是可恢复调度的例子:
T2 读取 student 表中 stuID=10 的元组时,该元组内容已由 T1 修改过,但 T2 提交操作
commit 早于 T1 提交 commit。一旦 T1 在 T2 的 commit 操作之后回滚其 update student 操作,将 stuName 回滚为旧值,则 T2 的 select 操作无法随着回滚,T2 读取的仍然是 stuName 修改后的值。

是否是无级联调度?Is S a cascadeless schedule, and why?
如果事务要对某个值执行读操作,则必须等到执行写入该值的事务 commit。

是否满足二阶段锁? obey the two-phase locking protocol?
在同一个事务中,前半部分全是lock,后面全是unlock,则满足,否则不满足
注意是在同一个事务中,如在T1这一列中看。

是否满足严格二阶段锁? Strict two phase locking protocol
共享锁(share):lock_s;排他锁(exclusive):lock_x
S2PLP 可以在 lock_s上锁之后随时释放它,但只能在 commit 的时候释放 lock_x
严锁在commit的时候同时释放所有锁。其主要区别简单来说,就是:2PL能随时释放锁,S2PL只能在事务结束后释放锁。但注意,随时释放不是指

是否满足严格二阶段锁?Rigorous two phase locking protocol
R2PLP 只能在 commit 的时候释放所有锁, lock_s 和 lock_x

赞赏