Oracle习题答案课后题.docx
《Oracle习题答案课后题.docx》由会员分享,可在线阅读,更多相关《Oracle习题答案课后题.docx(12页珍藏版)》请在冰豆网上搜索。
Oracle习题答案课后题
/articles/330494.html第一章
略
第二章
5、已知一个关系数据库的模式如下:
S(SNO,SNAME,SCITY)
P(PNO,PNAME,COLOR,WEIGHT)
J(JNO,JNAME,JCITY)
SPJ(SNO,PNO,JNO,QTY)
供应商S由供应商代码SNO、供应商姓名SNAME、供应商所在城市SCITY组成;零件P由零件代码PNO、零件名PNAME、颜色COLOR、重量WEIGHT组成;工程项目J由工程项目代码JNO、工程项目名JNAME、和所在城市JCITY组成;供应情况SPJ由供应商代码SNO、零件代码PNO、工程项目代码JNO、供应数量QTY组成。
用关系代数表达式表示下面的查询要求:
(1)求供应工程J1零件的供应商代码SNO
(2)求供应工程J1零件P1的供应上代码SNO
(3)求供应工程J1零件为红色的供应商代码SNO
(4)求没有使用天津供应商生产的红色零件的工程项目代码
JNO
(5)求至少用了供应商S1所供应的全部零件的工程项目代码
JNO
答:
(4)
JNO(J)—JNO(「CITY-天津'(S)SPJ「COLOR-红色'(P))
(5)PNO,JNO(SPJ)71PNOeSN0='S1'(SPJ))
第三章
22.建立一个关于系、学生、班级、学会等诸信息的关系数据库。
学生:
学号、姓名、出生年月、系名、班号、宿舍区。
班级:
班号、专业名、系名、人数、入校年份。
系:
系名、系号、系办公地点、人数。
学会:
学会名、成立年份、办公地点、人数。
语义如下:
一个系有若干专业,每个专业每年只招一个班,每个班有若干学生。
一个系的学生住在同一宿舍区。
每个学生可参加若干学会,每个学会有若干学生。
学生参加某学会有一个入会年份。
请给出关系模式,写出每个关系模式的极小函数依赖集,指出是否存在传递函数依赖,对于函数依赖左部是多属性的情况讨
论函数依赖是完全函数依赖,还是部分函数依赖。
指出各关系模式的候选码、外部码,有没有全码存在?
解:
(1)关系模式如下:
学生:
S(Sno,Sname,Sbirth,Dept,Class,Sloe)
班级:
C(Class,Major,Dept,Cnum,Cyear)
系:
D(Dept,Dno,Office,Dnum)
学会:
P(Pname,Pyear,Paddr,Pnum)
学生--学会SP(Sno,Pname,SPyear)
(2)每个关系模式的最小函数依赖集如下:
(a)、学生S(Sno,Sname,Sbirth,Dept,Class,Sloc)的最小函数依赖集如下:
SnoSname,SnoSbirth,SnoClass,ClassDept,DeptSloc
传递依赖如下:
由于SnoClass,Class\Sno,ClassDept
所以Sno与Dept之间存在着传递函数依赖。
由于SnoDept,Dept\Sno,DeptSloc
所以Sno与Sloc之间存在着传递函数依赖。
由于ClassDept,Dept\Class,DeptSloc
所以Class与Sloc之间存在着传递函数依赖。
(b)、班级C(Class,Major,Dept,Cnum,Cyear)的最小函数依赖集如下:
ClassMajor,ClassCnum,ClassCyear,Major
Dept,
(Major,Cyear)fClass
由于ClassMajor,Major\Class,MajorDept
所以Class与Dept之间存在着传递函数依赖。
(c)、系D(Dept,Dno,Office,Dnum)的最小函数依赖集如下:
DeptDno,DnoDept,DnoOffice,DnoDnum
根据上述函数依赖可知,Dept与Office,Dept与Dnum之
间不存在传递依赖。
(d)、学会P(Pname,Pyear,Paddr,Pnum)的最小函数依赖集如下:
PnamePyear,PnamePaddr,PnamePnum
该模式不存在传递依赖。
(e)、学生--学会SP的最小函数依赖集如下:
(Sno,Pname)fSPyear
⑶各关系模式的候选码、外部码,全码如下:
A、学生S候选码:
Sno;外部码:
Dept、Class;无全码
B、班级C候选码:
Class和(Major,Cyear);外部码:
Dept;无全码
C、系D候选码:
Dept或Dno;无外部码;无全码
D、学会P候选码:
Pname;无外部码;无全码
学生--学会SP候选码:
(Sno,Pname)夕卜部码:
Sno,Pname;无全码
23.试由amstrong公理系统推导出下面三条推理规则:
(1)合并规则:
若XfZ,XfY,则有XfYZ
(2)伪传递规则:
由XfY,WYfZ有XWfZ
(3)分解规则:
XfY,Z包含于Y,有XfZ
证明:
(1)已知XfZ,由增广律知XYfYZ,又因为XfY,可得XXfXYfYZ,最后根据传递律得XfYZo
(2)已知XfY,据增广律得XWfWY,因为WYf乙所以
XWfWYf乙通过传递律可知XWf乙
(3)已知Z包含于Y,根据自反律知Yf乙又因为XfY,所以由传递律可得XfZo
第四章
5.请从表EMP中查找工资低于2000的雇员的姓名、工作、工
资,并按工资降序排列。
selectename,job,salfromempwheresal<2000orderbysal
desc;
6.请从表中查询工作是CLERK的所有人的姓名、工资、部门
号、部门名称以及部门地址的信息。
selectename,sal,emp.deptno,dname,locfromemp,deptwhereemp.deptno=dept.deptnoandjob='CLERK';
7.查询表EMP中所有的工资大于等于2000的雇员姓名和他的经理的名字。
selecta.ename,b.enamefromempa,empbwherea.mgr=b.empnoanda.sal>=2000;
8.在表EMP中查询所有工资高于JONES的所有雇员姓名、作和工资。
selectename,job,salfromempwheresal>(selectsalfromempwhereename='JONES');
9.列出没有对应部门表信息的所有雇员的姓名、工作以及部门号。
selectename,job,deptnofromempwheredeptnonotin(selectdeptnofromdept);
10.查找工资在1000〜3000之间的雇员所在部门的所有人员信息
select*fromempwheredeptnoin(selectdistinctdeptnofromempwheresalbetween1000and3000);
11.查询列出来公司就职时间超过24年的员工名单selectenamefromempwherehiredate<=add_months(sysdate,-288);
日时分秒显示。
selectename,to_char(hiredate,'yyyy-mm-ddhh24:
mi:
ss')fromemp;
13.查询所有81年7月1日以前来的员工姓名、工资、所属部门的名字
selectename,sal,dnamefromemp,deptwhereemp.deptno=dept.deptnoandhiredate<=to_date(‘1-90871-01','y-ymymy-dd');
14.查询公司中按年份月份统计各地的录用职工数量selectto_char(hiredate,'yyyy-mm'),loc,count(*)fromemp,deptwhereemp.deptno=dept.deptnogroupbyto_char(hiredate,'yyyy-mm'),loc;
15.查询部门平均工资最高的部门名称和最低的部门名称selectdnamefromdeptwheredeptno=(selectdeptnofrom(selectdeptnofromempgroupbydeptnoorderbyavg(sal))whererownum<=1)unionallselectdnamefromdeptwheredeptno=(selectdeptnofrom(selectdeptnofromempgroupbydeptnoorderbyavg(sal)desc)whererownum<=1);
第五章
5.对每一个雇员,显示employee_id、last_namesalary和salary增加15%,并且表示成整数,列标签显示为New_Salary
SELECTemployee_id,last_name,salary,
ROUND(salary*1.15,0)"NewSalary"
FROMemployees;
6.写一个查询用首字母大写,其它字母小写显示雇员的
last_names,显示名字的长度,对所有名字开始字母是J、A或M的雇员,给每列一个适当的标签。
用雇员的last_names排序结
果。
SELECTINITCAP(last_name)"Name",
LENGTH(last_name)"Length"
FROMemployees
WHERElast_nameLIKE'J%'
ORlast_nameLIKE'M%'
ORlast_nameLIKE'A%'
ORDERBYlast_name;
7.对每一个雇员,显示其last_name,并计算从雇员受雇日期到今天的月数,列标签MONTHS_WORKED。
按受雇月数排序结果,四舍五入月数到最靠近的整数月。
SELECTlast_name,ROUND(MONTHS_BETWEEN
(SYSDATE,hire_date))"MONTHS_WORKED
FROMemployees
ORDERBYMONTHS_BETWEEN(SYSDATE,hire_date);
8.显示last_name>hire_date和雇员开始工作的周日,列标签为
DAY,以星期一作为周的起始日排序结果。
SELECTlast_name,hire_date,
TO_CHAR(hire_date,'DAY')"DAY"
FROMemployees
ORDERBYTO_CHAR(hire_date-1,'d');
第八章
5.
CREATEVIEWVW_DEPT_SUM(DEPT_NAME,EMP_COUNT,
MINSAL,MAXSAL,AVGSAL)