1数据库中常用的完整性约束包括哪些?
答:not null
unique
check
primary key
foreign key
2简述数据库系统与文件系统的主要区别。
答:参考课本19页1.8
3一般情况下,关系R与关系S要进行自然连接,需要满足什么条件?
答:至少有一个同名属性列。
4为什么要在数据库中引入事务的概念?
答:因为有些操作的集合要么全都发生,要么由于出错全都不发生,比如从支票账户到储蓄账户的资金转账,为了让这些操作能一起执行,把单一操作逻辑的集认为一个独立单元,即事务。
5已知视图 faculty的定义:create view faculty as select id, name,dept name from
instructor;当发布 insert into faculty values(130765’,‘Green,(Music’))命
令时,数据库系统如何执行?
答:参考书69页
这个插入必须被表示为对instructor的插入,这样必须给出salary的值,为此数据库有两种执行方案
1.拒绝插入,并向用户返回一个错误信息。
2.向instructor关系插入元组(‘130765’,‘Green,(Music’),null)
6用基本关系代数表达式来表示R ∩ \cap ∩S.
答: R ∩ S = R − ( R − S ) R\cap S=R-(R-S) R∩S=R−(R−S)
7某银行为不同储蓄金额执行不同利率:低于10万元一年支付4.2%的利息,10万元以上(包括10万)一年支付4.5%的利息。假设储蓄账户表 account(aid(account_id),balance, branch_name),写出与上述业务相对应的SQL语句,如何保证其执行结果的正确性?
答:
UPDATE account
SET balance= CASE
WHEN balance<100000 THEN balance*1.042
ELSE balance*1.045
END;
CASE结构的存在可以被利用来在一条UPDATE语句中执行前面的两种更新,避免前面发生的问题!这样就能保证其执行结果的正确性,如果不使用case语句,考虑到加上利息后余额可能超过10万,应该先更新大于10万的,再更新小于十万的。
UPDATE account
SET balance=balance*1.045
WHERE balance>=100000;
UPDATE account
SET balance=balance*1.042
WHERE balance<100000;
复习,case结构一般如下
case
when pred1 then result1
when pred2 then result2
...
when predn then resultn
else result0
end;
不确定
8什么样的关系模式满足BCNF?
答:对于 F + F^+ F+的所有形如 α → β \alpha\to\beta α→β的函数依赖(其中 α ⊆ R , β ⊆ R \alpha\subseteq R,\beta\subseteq R α⊆R,β⊆R),下面至少有一项成立。
1. α → β \alpha\to\beta α→β是平凡的函数依赖
2. α \alpha α是模式 R R R的一个超码
9关系数据库中,超码、候选码、主码有什么区别?
答:超码就一个或多个属性的集合,这些属性的组合可以在一个关系中唯一地标识一个元组。
如果一个超码的任意真子集都不能称为一个超码,那它就是一个候选码,候选码是最小的超码。
数据库设计者从候选码中任意选取一个码,叫做主码。
10关系代数中,选择操作的功能是什么?
答:选择运算选出满足给定谓词的元组。
投影运算返回作为参数的关系,但把某些关系排除在外。
集合差运算使得我们可以找出一个在一个关系中而不在另一个关系中的元组。
笛卡尔积运算可以把任意两个关系组合起来。
11简述数据库中引入封锁机制的优缺点。
答:优点:有效防止“丢失更新”,保证可重复读和不读“脏”数据
缺点:产生了活锁,饿死和死锁的问题。
12数据库中,调度指的是什么?
答:调度指的是指令在系统中执行的时间顺序,一组事务的一个调度一定包含了这组事务的所有指令,而且必须保持指令在各个事务中出现的时间顺序。
13事务由哪几个状态组成?判断当手机支付已提交,但由于网络信号消失而导致支付失败,此时,事务处于何种状态?
答:
由活动的、部分提交的、失败的、中止的、提交的
事务处于失败状态。
14在MySQL中定义foreign key时,与标准SQL有何区别?
答:主外键约束在标准SQL下体现的是一种一对多的关系,但是经过MySQL的拓展之后可以表现出“多对多”的关系。搞不懂,应该不会考
15MySQL 中不支持 INTERSECT语句,可以用哪些语句来代替?
答:有关系R S,求R INTERSECT S语句,可以这样
SELECT *
FROM R EXCEPT
(
SELECT *
FROM R EXCEPT S
)
即 R ∩ S = R − ( R − S ) R\cap S=R-(R-S) R∩S=R−(R−S)
16数据库中如何判断死锁是否发生?
答:死锁的检测需要维护一个资源等待图,周期性的激活一个在等待图中搜索环的算法,如果检测到了环的存在,那么判断死锁已经发生。
拓展知识点
从死锁中恢复
1.选择牺牲者
2.回滚
3.饿死
17什么样的调度一定能够保证数据的一致性?
答:可串行化调度。
18为了保证数据库的并发性,引入了哪些锁?
答:共享锁:事务T可读但不可写数据项Q
排他锁:书屋T可读又可写数据项Q
19为什么事务非正常结束时会影响数据库数据的正确性,请举例说明。
答:如果在A转账给B的过程中,A扣款成功了,但是此时事务非正常结束,此时B没有收到欠款,数据库处于不一致状态,这影响了数据库数据的正确性。
20.利用 Armstrong公理证明伪传递律:若有A→B,CB→D,则有AC→D.
答:Armstrong公理有自反律、传递律,增补律
推广有合并律、分解律、伪传递律
使用增补律
A C → C B AC\to CB AC→CB
使用传递律
A C → D AC\to D AC→D
得证。
扩展Armstrong公理证明合并律的正确有效性(提示,使用增补率可证,若 α → β \alpha\to\beta α→β则 α → α β \alpha\to\alpha\beta α→αβ。再次使用增补律,利用 α → γ \alpha\to\gamma α→γ。然后使用伪传递率)
答: α → β \alpha\to\beta α→β 自带的
α α → α β \alpha\alpha\to\alpha\beta αα→αβ 增补律
α → α β \alpha\to\alpha\beta α→αβ 合并
α → γ \alpha\to\gamma α→γ 给定
α β → γ β \alpha\beta\to\gamma\beta αβ→γβ 增补律
α → β γ \alpha\to\beta\gamma α→βγ 传递律
1两个人分别在去哪儿网和携程网上购买2017年7月2日,CZ6147次航班,从长春飞往北京,但该航班的经济舱只剩一张票,两个人同时下单,数据库中要如何控制?
答:使用事务并发控制,对这两个事务进行可串行化调度。
2很多在线手机游戏都支持离线操作,即当网络不通时,可以离线玩,等联网之后再进行数据同步,在这个过程中,可能涉及数据库的哪些概念?
答:涉及事务管理,补偿事务,一致性,持久性。这个问题我不会
3用户到银行开了一个储蓄账户(account表),可以随时对该账户进行存钱、取钱等管理,分别对应数据库中的什么操作?在ATM机上取钱,当卡内余额不足时,ATM机不做任何支付,如何将此规则定义在该表上?
答:存取都钱对应UPDATE操作,对account的余额balance添加域约束
check(balance>=0);在执行扣款事务的时候,余额不足余额会小于0,这时事务会失败并回滚。
4.吉林大学一卡通实现了与银行的绑定,当一卡通内余额小于某一设定的金额的时候,可以通过银行卡直接转账,请问如何实现自动转账?转账的金额在数据库端如何设定?
答:创建一个触发器,当一卡通内余额被修改时启动触发器,如果修改过后余额小于设定金额,就执行转账事务。这个问题我也不会
1某金融公司为客户提供理财服务。公司提供股票、基金、外币等多种投资理财项目,并且为每位用户配备一个理财经理,为客户提供投资咨询服务,客户可以购买一种或多种理财产品,根据买卖的时间和购买的金额来计算收益。每个客户还可以推荐下线客户,每个客户只能有一个上线。
1.根据上述需求,画出E-R模型
2.将E-R模型转化为对应的关系模型,并说明每个关系模式种需要设置的完整性约束。
注:实体的属性根据实际情况自行设定,每个实体不少于三个属性,不多于五个属性。
理 财 项 目 ( 项 目 i d ‾ , 项 目 名 , 项 目 计 划 ) 理财项目(\underline{项目id},项目名,项目计划) 理财项目(项目id,项目名,项目计划) 主键项目id
买 卖 信 息 ( 买 卖 i d ‾ , 买 时 间 , 卖 时 间 , 买 卖 金 额 ) 买卖信息(\underline{买卖id},买时间,卖时间,买卖金额) 买卖信息(买卖id,买时间,卖时间,买卖金额)主键买卖id
客 户 ( 客 户 i d ‾ , 经 理 i d ‾ , 客 户 名 , 客 户 电 话 ) 客户(\underline{客户id},\underline{经理id},客户名,客户电话) 客户(客户id,经理id,客户名,客户电话)主键客户id和经理id,外键经理id参考理财经理
理 财 经 理 ( 经 理 i d ‾ , 经 理 名 , 经 理 电 话 ) 理财经理(\underline{经理id},经理名,经理电话) 理财经理(经理id,经理名,经理电话)主键经理id
购 买 ( 项 目 i d ‾ , 客 户 i d ‾ , 买 卖 i d ‾ ) 购买(\underline{项目id},\underline{客户id},\underline{买卖id}) 购买(项目id,客户id,买卖id)主键项目id客户id买卖id外键也是它们,参考理财项目、买卖信息和客户
发 展 客 户 ( 客 户 i d ‾ , 下 线 i d ‾ ) 发展客户(\underline{客户id},\underline{下线id}) 发展客户(客户id,下线id)对下线id有unique约束,主键是客户id下线id
1设有如图所示调度S,判别S是否为冲突可串行化调度?如果是,则给出与S等价的一个串行调度。
可以看出有环的存在,所以肯定不能进行可串行化调度。
2设有关系模式R(A,B,C,D,E,F,G,H,I),其中各属性分别代表A交通肇事编号;B交通肇事发生时间,C交通肇事具体原因,D违章扣分,E违章罚款金额,F交通肇事发生车辆车牌号码,G交通肇事车型号及颜色,H违章驾驶员驾照号,I驾照已扣分数。其中:
完成以下任务:
(1)根据语义给出R的函数依赖
(2)将该关系模式分解为3NF
答:(1) H → I F , F → G H , A → B C , A F → D E H \to IF,F \to GH,A\to BC,AF \to DE H→IF,F→GH,A→BC,AF→DE
(2)求候选码
左边属性有HFA
右边属性有IFGHBCDE
所以左部属性是A
右部属性是BCDEIG
双部属性是FH
A F + = A B C D E F G H I {AF}^+=ABCDEFGHI AF+=ABCDEFGHI
A H + = A B C D E F G H I AH^+=ABCDEFGHI AH+=ABCDEFGHI
其中AF已经在里面了,所以不需要再加
得分解结果为{HIF},{FGH},{ABC},{AFDE}
1某连锁超市商品管理系统中,包含如下关系模式
门店MD(门店编号Mid,门店名称Mname,店员人数MRnum,地址Maddress)
商品SP(商品编号Pid,商品名称Pname,价格Price)
所属关系MP(门店编号Mid,商品编号Pid,商品数量Pnum)
1用关系代数表达式查询:店员人数不少于50人的门店名称和地址。
Π M n a m e , M a d d r e s s ( σ M R u n > = 50 ( M D ) ) \Pi_{Mname,Maddress}(\sigma_{MRun>=50}(MD)) ΠMname,Maddress(σMRun>=50(MD))
2用关系代数表达式查询:找出至少供应了代号为“256”的商店所供应的全部商品的其它商店名和地址。
Π M n a m e , M a d d r e s s ( M D ⋈ ( σ P i d < > 256 ( M P ÷ Π P i d ( σ M i d = 256 ( M P ) ) ) ) ) \Pi_{Mname,Maddress}(MD⋈ (\sigma_{Pid<>256}(MP\div\Pi_{Pid}(\sigma_{Mid=256}(MP))))) ΠMname,Maddress(MD⋈(σPid<>256(MP÷ΠPid(σMid=256(MP)))))
3用SQL语句查询:库存数量小于10件的商品名称及所在的门店名称
select distinct Pname,Mname
from sp natural join mp natural join md
where Pnum<10 ;
4用SQL语句查询:各门店名称和所拥有的商品的总价格
select distinct Mname,sum(Price*Pnum) as APrice
from sp natural join mp natural join md
group by Mname,Mid;
5用SQL语句,将“256”号门店的“泉阳泉”的数量增加2000
update mp
set Pnum=Pnum+2000
where Mid=256 and Pid=(
select Pid
from sp
where Pname='泉阳泉'
) ;
mySQL测试本题使用代码
CREATE TABLE MD ( Mid INT, Mname VARCHAR ( 20 ),MRnum INT, Maddress VARCHAR ( 50 ), PRIMARY KEY ( Mid ) );
CREATE TABLE SP ( Pid INT, Pname VARCHAR ( 20 ), Price INT, PRIMARY KEY ( Pid ) );
CREATE TABLE MP (
mid int,
pid int,
pnum int,
primary key ( mid,pid),
foreign key ( mid) references md ( mid ),
foreign key (pid) references sp(pid)
);
INSERT INTO md VALUES(256,'家乐福',60,'霹雳大街');
INSERT into md values(254,'家家乐',7,'桂林路');
INSERT into md values(255,'沃尔玛',7,'保利罗兰香谷');
INSERT into md values(252,'家家乐',17,'万达广场');
insert into sp values(12,'棉花糖',25);
insert into sp values(15,'泉阳泉',10);
insert into sp values(11,'农夫山泉',2);
insert into sp values(10,'桃子汽水',6);
insert into mp values(256,12,30);#家乐福棉花糖
insert into mp values(256,15,3);#家乐福泉阳泉
insert into mp values(254,12,5);#家家乐棉花糖
insert into mp values(254,15,8);#家家乐泉阳泉
insert into mp values(254,11,10);#家家乐农夫山泉
insert into mp values(255,11,12);#沃尔玛农夫山泉
insert into mp values(255,15,6);#沃尔玛泉阳泉
insert into mp values(252,10,60);#家家乐桃子汽水
select distinct Pname,Mname
from sp natural join mp natural join md
where Pnum<10 ;
select distinct Mname,sum(Price*Pnum) as APrice
from sp natural join mp natural join md
group by Mname,Mid;
update mp
set Pnum=Pnum+2000
where Mid=256 and Pid=(
select Pid
from sp
where Pname='泉阳泉'
) ;