1 sql和查询
1.拿到题目,首先看条件里有什么属性,查询的是什么属性。
将有需要属性的表全部乘起来,再写条件。
2.尽量不要用natural join,用乘起来然后,每个条件都另起一行
where …, …
and …,…
3.查询唯一,可以使用unique,方法是,外查询的属性,写在unique的条件里面,unique用unique查询一个表的所有符合条件的值。
比如A, B通过属性a连接,要求A在B中属性b是唯一的。
select A.a
from A, B as s
where A.a=s.a
And unique(
select b from B as t
where t.a = s.a
)
或者使用count(distinct 属性)=1
select A.a from A, B
where A.a=B.a
grouping by A.a
having cout(distinct B.b)=1
2.找最大最小值,使用>=all(…)
3.如果是自身和自身属性比,则自身和自身乘起来,注意只需要乘比的那个属性,如果一个表和它连接,可以先自乘,再连接
4.如果需要连接,尽量在连接前把条件先选择好,然后再连接。
5.写事务不要忘记commit ;
ER图
1.从描述画ER图,首先先写出关系模式,然后:
实体是否是别的实体的一个属性,是则转为属性,删除联系集。
如果是多值属性,单独变为实体集,新增联系集。
如果属性是别人的主码,删除该属性,新增联系集。
注意:多对一和一对多,注意弱实体集和强实体集的联系集是双线菱形。
2.从ER图画关系模式
在之前的基础上,再次化简,
如果A,B,AB,某一个完全参与,则三个表化简为AB
强弱实体集的联系集是冗余的。
关系范式
1.正则覆盖,删去哪边的,就让F在这边。
比如AB->C,删除B,那么看F->(A->C)
比如A->BC,删除B,那么看(A->C)和F-{A->BC}->F
2.候选码,首先看从来没有在右边出现过的,一定是主属性。如果还是不行,挑若干个出现过的,一个一个试验。此时,注意没有出现在依赖中的,一定也是主属性。
3.BCNF分解:判断方法:a->b, 满足b属于a或者a是超码
分解方法:对于每一个依赖,如果不满足a是超码,分解为{a,b}和R-b+a
4.3NF分解:判断方法:a->b, 满足b是主属性或者a是超码或者b属于a三个条件之一。
分解方法:求正则覆盖,把每个依赖都分解为一个子集。如果不包含候选码,则加入一个包含候选码的子集,可以保证无损分解。
5.依赖保持:要求正则覆盖的每个依赖在分解后的一个子集中成立。
无损分解:要求分解后两个子集交集包含候选码
4 XML
1.如果是自己设计,尽量都写为子元素。
2.最外面不要忘记,括号里面才是开始写的东西
别忘记,最外面一层也必须写进<!ELEMENT xxx>里面
3.xPath查询,/最外面名字/…/…,括号表示这层节点需要满足的条件。
括号里面通过./继承括号外面路径,
属性需要加上@, 方括号里面,子节点的条件不需要加@
可以使用id(属性)直接定位到id所在的节点
可以使用count(路径)计算节点个数
返回时需要返回text()
如果给了DTD,画出一颗树,更加方便
4.xQurey查询,for $p in path where 。。
path和3中的一样,但是最好不要写太多条件。
where 里面相当于原来path里面括号内的内容。可以用$p作为代替for … in path中的path。return $p/@属性,返回需要的属性
可以用嵌套的for,就是笛卡尔积。
返回的时候,不要忘记加<xx>{@返回的属性}<xx>
5 索引
记住叶节点最多n-1个key, 最少 [ n − 1 2 ] [\frac{n-1}2] [2n−1]个key, 上取整
非叶节点最多n个孩子,最少n/2上取整个孩子
高度就是以非叶节点的孩子数为底数,以叶节点个数(key需要转为叶节点个数)为真数取对数。
任何内存替换,必须从根开始读到该节点。
6 查询
1.估算查询结果的大小,看查询的语句里面是多少记录,每个查询条件都看成均匀概率乘起来
2.有关block seek和block transfor,猜测考的是hash join,分为递归和非递归的情况。如果猜错了,希望考block nested loop,不然直接gg
7 锁
1.可能考upgrade和downgrade,具体怎么考不知道
2.如果是事务,画等待图,如果是锁表,画优先图
看是否可串行化,看等待图是否有环
8 恢复算法
猜测考Aries恢复算法