数据库练习题题解作业

期末考试大题题型:

1、    需要将学校中的系、教员、课程,以及他们之间的联系组织到关系数据库中,对于每个系需要存储的信息有系号、系名、系主任;对于每个教员,需要存储的信息有职工号、姓名、专长;对于每门课程,需要存储的信息有课程号、课程名、学分。有关的联系是:每个系有若干名教员,开设若干门课程;每位教员只在一个系工作;每门课程只由一个系开设,每位教员可讲授多门课程;每门课程可由多位教员讲授;课程之间有先修关系,每门课程可能需要多门其他课程做它的直接先修课,每门课程可以作为多门其他课程的直接先修课。要求:
1)转化ER图。(6分)
系(系号、系名、系主任)主码是系号
教员(职工号、姓名、专长、系号)主码是职工号,外码是系号
课程(课程号、课程名、学分、系号)主码是课程号,外码是系号
教授关系(教员号、课程号)主码是教员号和课程号,外码是教员号、课程号
先修课关系(课程号、先修课的课程号)主码是程号和先修课的课程号,外码是程号、先修课的课程号

四.设关系R具有属性集合{ A,B,C,D,E },函数依赖集合为F={A—>B,BC—>E,ED—>AB }。求解下列各题:

  1. 计算A+、(AB)+、(ABC) +、(BCD) +
  2. 求等价于F的所有极小函数依赖集Fm,并说明求解步骤;
  3. 求R的所有候选码,并说明理由;
  4. R最高满足第几范式?为什么?
  5. 若R不属于BCNF,试改进该关系数据库设计,使它满足BCNF

1.

A+=AB AB+=AB  ABC+=ABCE       BCD+=BCDEA(也为候选码)

2.

详细参见https://blog.csdn.net/lanshan1111/article/details/83959030

将依赖右边属性单一化,结果为:

F1={A->B,BC->E,ED->A,ED->B}

去掉左边属性冗余,也就是看是否可以由右边元素的子集推出右边

在F1中去掉依赖左部多余的属性,结果为

F2={A->B,BC->E,ED->A,ED->B}//显然此题不能由子集...

看是否有依赖ED->A,A->B,则ED->B去掉即可得到FM

在F2中去掉多余依赖

FM={A->B,BC->E,ED->A}

3.

也就是求它的所有子集(A,B,C,D,E,AB,AC...ABC...)的闭包,看是否为全集

ACD,BCD,CDE都是,可以看出来必须含有D,C因为依赖右边没有它俩的事,技巧

4.

满足了第一范式,它有部分依赖BC->E,它只能是1NF//这句话是错的:::::::::::看其也没有部分依赖也是//这句话是错的::::::::::::::::::第二,也没有传递依赖,就是第三,但A->B,A中无码,就不是BCNF

5.

分解为{A,B},{EDA}{CDE}

五.设有关系模式R(F,G,H,I,J),R的函数依赖集:F={F—>I,J—>I,I—>G,GH—>I,IH—>F}

(1)求出R的所有候选码。

(2)判断ρ={FG,FJ,JH,IGH,FH}是否为无损连接分解?

(3)将R分解为3NF,并具有无损连接性和依赖保持性。

ρ={R1(J,I), R2(G,H,I),R3(I,H,F),R4(J,H)}

//怎么求也没给说:

第一步就是先求它的最小依赖集

这一段落有待商榷:

结果:这个依赖集隐藏太深了{j->i,GH->I,IH->F}消去F->I,I->G是因为I—>G,GH—>I 得到GH->G一定成立,消去F—>I同理IH—>F,F->I得到IH->I恒成立//陷阱

//上边的这句话不对!这样写出只是为了便于写出分解以后的式子,直接按照依赖合并即可,当然也可以求出最小依赖集然后去重

最小依赖集并不用去掉F—>I    I->G,正确的最小依赖集应是{J->I,GH->I,IH->F,F->I,I->G}

第二步就是合并求得的最xiao 依赖集

JI,GHI,IHF发现码并不在其中,再并上第一步取得的JF

结果:

P={R1(JI),R2(GHI),R3(IHF),R4(JH)}

OK

怎么求分解成BCNF?保持无损连接的分解,分解成BCNF并不总满足保持依赖

例:关系模式R<U,F>,其中:U={A,B,C,D,E},F={A→C,C→D,B→C,DE→C,CE→A},将其分解成BCNF并保持无损连接。

      解:

      ① 令ρ={R(U,F)}。

      ② ρ中不是所有的模式都是BCNF,转入下一步。

      ③ 分解R:R上的候选关键字为BE(因为所有函数依赖的右边没有BE)。考虑A→C函数依赖不满足BCNF条件(因A不包含候选键BE),将其分解成R1(AC)、R2(ABDE)就是每次去掉分解的右面的那个元素。计算R1和R2的最小函数依赖集分别为:F1={A→C},F2={B→D,DE→D,BE→A}。其中B→D是由于R2中没有属性C且B→C,C→D;DE→D是由于R2中没有属性C且DE→C,C→D;BE→A是由于R2中没有属性C且B→C,CE→A。又由于DE→D是蕴含关系,可以去掉,故F2={B→D,BE→A}。

      分解R2:R2上的候选关键字为BE。考虑B→D函数依赖不满足BCNF条件,将其分解成R21(BD)、R22(ABE)。计算R21和R22的最小函数依赖集分别为:F21={B→D},F22={BE→A}。

      由于R22上的候选关键字为BE,而F22中的所有函数依赖满足BCNF条件。故R可以分解为无损连接性的BCNF如:ρ={R1(AC),R21(BD),R22(ABE)}
 

 

1.

还是求所有子集闭包,看起是否为U,易得JH(他俩在右边未出现过,必有他俩)为其候选码

2.

//https://blog.csdn.net/lanshan1111/article/details/83961908认真看就会了

//宿舍网太垃圾了,上传个图片都费劲,明明成功又他妈类型错误

易知为无损分解

3.

首先看它目前第几范式,JH候选码,J->I部分依赖,只能到达1NF

分解成ρ={R1(J,I), R2(G,H,I),R3(I,H,F),R4(J,H)},套路

解释同上

六.已知学生表S和学生选课表SC。其关系模式如下:

S(SNO,SN,SD,PR0V)

SC(SN0,CN,GR)

其中,SNO为学号,SN为姓名,SD为系名,PROV为省区,CN为课程名,GR为分数。试用SQL语言实现下列操作:

(1)查询“信息系”的学生来自哪些省区。

(2)按分数降序排序,输出“英语系”学生选修了“计算机”课程的学生的姓名和分数。

select PROV FROM S WHERE SD='信息系';//该死的引号

select SN,GR FROM S,SC WHERE SC.SNO=S.SNO AND SD=英语系 and CN='计算机' order by GR DESC;

  1. 设有如下三个基本表:A(A#,ANAME,WQTY,CITY);B(B#,BNAME,PRICE);AB(A#,B#,QTY)。表中各个属性的含义如下:A#(商店代号)、ANAME(商店名)、WQTY(店员人数)、CITY(所在城市)、B#(商品号)、BNAME(商品名称)、PRICE(价格)、QTY(商品数量)。试用SQL语言写出下列查询,并给出执行结果:

(1)找出店员人数不超过100人或者在长沙市的所有商店的代号和商店名。

select A#,ANAME FROM A WHERE WQTY<=100 OR CITY='长沙市';

(2)找出供应书包的商店名。

SELECT ANAME FROM A,B,AB WHERE A.A#=AB.A# AND B.B#=AB.B# AND B.BNAME='书包';

      (

 

3)找出至少供应代号为256的商店所供应的全部商品的商店名和所在城市。

SELECT ANAME,CITY FROM A WHERE NOT EXISTS(SELECT * FROM AB X WHERE X.A#='256' AND NOT EXISTS (SELECT * FROM AB Y WHERE A.A#=Y.A# AND Y.B#=X.B#)); 

//类似于求解至少选修了20171789同学全部课程的学号

select  distinct  sno from sc x where not exists(select * from sc y where y.sno='20171789' and not exists(select * from sc z where z.sno=x.sno and z.cno=y.cno));

    • 关系代数和SQL查询 (25分)
      1. 设有关系数据库:职工关系EMPLOYEE (职工号,职工名,街道,城市)

                工作关系WORKS (职工号,公司号,工资)

                公司关系COMPANY (公司号,公司名,城市)

假设职工可在多个公司兼职,请用关系代数表达式和SQL语句写出至少在公司号为‘C2’和‘C5’公司兼职的职工的职工号。

Select 职工号 from  工作关系 where 公司号=’C2’ and 职工号 in (select 职工号 from 工作关系 where 公司号=’C5’;
select
职工号 from works where 职工号 in (select 职工号 from works where 公司号=’C2’) and 公司号=’C5’

      1. 图书出版管理数据库中有两个基本表:

图书 (书号,书名,作者编号,出版社,出版日期)

作者 (作者编号,作者名,年龄,地址)

试用SQL语句写出下列查询:检索年龄低于作者平均年龄的所有作者的作者名、书名和出版社。

Select 作者名,书名,出版社 from 作者,图书 where 作者.作者编号=图书.作者编号 and 年龄<select avg(年龄) from 作者;

Select 作者名,书名,出版社

From 图书,作者

Where 图书.作者编号=作者.作者编号 and 年龄<(select AVG(年龄) from 作者)

      1. 设有职工关系模式如下:

PEOPLE(pno,pname,sex,job,wage,dptno)

其中:pno---职工号      pname---职工姓名    sex---性别

job---职业       wage-----工资      dptno----所在部门号

请分别写出下列查询要求的SQL语句

  1. 查询出工资比其所在部门平均工资高的所有职工信息。

  2. select * from people x where x.wage>(select AVG(wage) from people y where y.dptno=x.dptno)
  3. 查询列出工资大于赵明华工资的所有职工的信息。
      1.  
      2. Select * from PEOPLE  x where x.wage >select  avg(wage)  from PEOPLE y where x.dptno=y.dptno );
      3.  
      4. Select * from PEOPLE where wage>select wage from PEOPLE where pname =’赵明华’;
      5. 设有四个关系模式如下:

S(sno,sname,state,city)---供应商关系

其中:sno---供应商号      sname---供应商名   city----供应商所在城市

P(pno,pname,color,wei,price)---零件关系

其中:pno---零件号     pname----零件名     color----零件颜色    price----单价

J(jno,jname,city)---工程项目关系

其中:jno---工程项目号   jname---工程项目名  city----工程项目所在城市

SPJ(sno,pno,jno,qty)---供应关系

其中:qty----供应零件数量

请分别写出下面查询要求的关系代数表达式和SQL语句:

查询列出供应了全部零件的供应商名和他所在的城市。   

Select sname ,city from S where not exists(select * from P where not exists(select * from SPJ  where sno=S.cno and pno=P.pno);

Select sname from S,P ,SPJ where  S.sno =SPJ.sno and P.pno=SPJ.pno and P.color =’RED’;

 

询列出供应红色零件的供应商名。

  1. select
    select sname from s,p,spj where s.sno=spj.sno and p.pno=spj.pno and color=’
    红’
      1. 设有学生表S(SN0,SN)(SN0为学生号,SN为姓名)和学生选修课程表SC(SNO,CNO,CN,G)(CN0为课程号,CN为课程名,G为成绩),试用SQL语言完成以下各题:

  (1)建立一个视图V—SSC(SNO,SN,CNO,CN,G),并按CNO升序排序;

  (2)从视图V—SSC上查询平均成绩在90分以上的SN、CN和G

Create view V-SSC(SNO,SN,CNO,CN,G) as select S.SNO,SN,CNO,CN,G from S,SC WHERE S.SNO=SC.SNO ORDER BY CNO ;

Select SN,CN,G FROM V—SSC  GROUP BY SNO HAVING  AVG(G) >90 ;//一定不能用where 而是having

因为WHERE子句中是不能用聚集函数作为条件表达式

 

猜你喜欢

转载自blog.csdn.net/lanshan1111/article/details/84036435