
哈工大数据库系统作业一--关系代数
哈工大数据库系统作业一--关系代数
作业内容
在关系代数运算器 RelaX 中(https://nireas.iee.ihu.gr/relax/calc.htm)选择数据集“Database Systems The Complete Book - Excercise 2.4.3”,并用关系代数表示查询。
该数据库包含 4 个关系:
Classes(class, type, country, numGuns, bore, displacement)
关系 Classes 记录了舰船级别的信息,包含以下属性:
class:舰船级别(class)的名称,通常是这个级别的第一艘船的名字。
type:该级别舰船的类型,取值为 bb 或 bc,其中 bb 表示战列舰(battleship),bc 表示巡洋舰(battle cruiser)。
country:该级别舰船的制造国家。
numGuns:该级别舰船的主炮(main gun)数量。
bore:该级别舰船的主炮口径。
displacement:该级别舰船的排水量。
Ships(name, class, launched)
关系 Ships 记录了舰船的信息,包含以下属性:
name:舰船的名字。
class:舰船的级别。
lauched:舰船的下水日期。
Battles(name, date)
关系 Battles 记录了舰船参与的海战,包含以下属性:
name:海战的名称。
date:海战的时间。
Outcomes(ship, battle, result)
关系 Outcomes 记录了舰船在海战中取得的结果,包含以下属性:
ship:舰船的名字。
battle:海战的名称。
result:舰船在海战中取得的结果,取值为 sunk(沉没)、damaged(负伤)或 ok(完好)。
在该数据库上用关系代数完成下列查询:
(20 分)查询在 1921 年以前下水且没有参加过海战的舰船的名字。
(20 分)查询参加了 Guadalcanal 海战的舰船的名字、排水量和主炮数量。
(20 分)查询只包含 2艘舰船的级别,列出级别的全部属性。
(20 分)查询既有战列舰又有巡洋舰的国家。
(20分)查询沉船数量最多的战斗,列出战斗的名称。
思考题:查询在某次战斗中负伤,但随后又参加了其他战斗的舰船,列出舰船的名称。(不用在作业中回答。因为数据集小,可能没有查询结果。)
要求:
不允许使用赋值运算(=)。
在关系代数运算器 ReleX 中完成并验证你给出的查询表达式,并将你书写的表达式填写在作业答案中。
提示:日期型属性值的表示方法如下:例如,1941 年 5 月 24 日表示为 date('1941-05-24')。
答案:
1.π name (σ launched < 1921 (Ships)) - π ship (Outcomes)
2.π ship,displacement,numGuns σ ship=name ((Classes⨝Ships) ⨝ battle='Guadalcanal' Outcomes)
3.π class,type,country,numGuns,bore,displacement Classes⨝(σ Amt=2 (γclass;count(*)->Amt (Classes⨝Ships)))
4.π country ( σ type='bb' (Classes)) ∩ π country ( σ type='bc' (Classes))
5.πbattle (γ max(Amt) -> Amt ((γ battle; count(*) -> Amt (σ result='sunk' Outcomes)))⨝(γ battle; count(*) -> Amt (σ result='sunk' Outcomes)))
注:非最佳答案,本人自己写的,仅用于备份
更多推荐
所有评论(0)