数据库第三章课后习题解答Word格式.docx

上传人:b****5 文档编号:20728227 上传时间:2023-01-25 格式:DOCX 页数:20 大小:184.10KB
下载 相关 举报
数据库第三章课后习题解答Word格式.docx_第1页
第1页 / 共20页
数据库第三章课后习题解答Word格式.docx_第2页
第2页 / 共20页
数据库第三章课后习题解答Word格式.docx_第3页
第3页 / 共20页
数据库第三章课后习题解答Word格式.docx_第4页
第4页 / 共20页
数据库第三章课后习题解答Word格式.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

数据库第三章课后习题解答Word格式.docx

《数据库第三章课后习题解答Word格式.docx》由会员分享,可在线阅读,更多相关《数据库第三章课后习题解答Word格式.docx(20页珍藏版)》请在冰豆网上搜索。

数据库第三章课后习题解答Word格式.docx

图3.18用基本操作创建students表

其中,SEX字段取值为0或1,需要建立约束。

操作是用右键单击SEX字段,从弹出的菜单中选择“CHECK约束”,再从弹出的“属性”窗体中,选择“CHECK约束”卡,在约束表达式框中输入约束表达式,如图3.19所示。

图3.19输入约束表达式

最后,单击“保存”图标,SQLServer将弹出一个“选择名称”对话框,输入表名“students”,单击“确定”按钮,新建的students表结构将被保存起来。

3.5在Access中,完成习题3.4的要求。

(SNOtext(10)notnullprimarykey,

NAMEtext(10)notnull,

SEXtext(10)notnull,

BDATEdatetime,

DEPTtext(10),

DORMITORYtext(10))

注意,J-SQL的CREATETABLE语句没有提供对字段的检查约束。

可以在创建表后,使用基本操作方式,对SEX字段建立有效性规则。

3.7在SQLServer中,创建表Depts(DNO,DNAME,MGR)。

用SQL语句在习题3.4中创建的Students表中将DEPT设置为外键,引用Depts表中的DNO列值。

若某系还有学生时,不得在Depts表中删除该系的记录。

usemydb

createtableDepts

(DNOvarchar(10)notNULLprimarykey,

DNAMEchar(10)notNULL,

MGRchar(10))

altertablestudentsaddconstraintc1

foreignkey(Dept)referencesDepts(Dno)ondeletecascade

3.8什么是视图?

视图的作用是什么?

在习题3.4所创建的Students表的基础上,建立一个显示所有计算机系学生的视图,假设计算机系的代号为‘CS’。

go

createviewstudent_cs_view/*SQLSERVER约定:

本语句必须为批处理的第一个语句*/

as

select*

fromstudents

wherestudents.DEPT='

cs'

3.11在SQLServer中完成下列操作:

①用修改表结构语句在Students表中添加整型的Height和Weight字段。

②创建一个规则并绑定到Height列,用以限制插入到该列的整数围。

③创建一个默认值并绑定到Weight列,插入记录时,默认值自动填充到该列中。

④基于Students表与Depts表,分别建立惟一性约束、检查约束、主键约束、外键约束和参照(引用)完整性约束,并辅以其他操作予以验证。

⑤创建并执行一个带SELECT查询语句的存储过程,统计出每个系的学生平均身高。

⑥创建一个触发器,其功能是:

当试图在Depts表中修改数据时将发出警告消息。

①在Students表中添加整型的Height和Weight字段:

altertablestudentsaddHeightint,Weightint

②创建一个规则并绑定到Height列,用以限制插入到该列的整数围:

createruleR1asrange>

=145andrange<

=200

execsp_bindrulerulename='

R1'

objname='

students.Height'

③创建一个默认值并绑定到Weight列,插入记录时默认值自动填充到该列中:

createdefaultD1as50

execsp_bindefaultdefname='

D1'

objname='

students.Weight'

④基于Students表与Depts表,分别建立惟一性约束、检查约束、主键约束、外键约束和参照(引用)完整性约束:

/*假设在mydb库中建表,若表students已存在,创建前先把该表删除*/

(SNOchar(10)notNULLprimarykey,/*主键约束*/

NAMEvarchar(10)notNULLunique,/*惟一性约束*/

SEXchar

(1)notNULLcheck(sex='

orsex='

),/*检查约束*/

DEPTvarchar(10)constraintc1foreignkey(Dept)/*外键约束*/

referencesDepts(Dno)ondeletecascade,/*参照完整性约束*/

DORMITORYvarchar(10)

注:

创建表后,有关验证性的操作,请读者自行完成。

⑤创建一个带SELECT查询语句的存储过程p1,统计出每个系的学生平均身高:

createprocp1

as

selectdept,avg(Height)asavg_h

fromstudents

groupbydept

return

执行存储过程p1的语句如下:

execp1

⑥创建一个触发器,其功能是当试图在Depts表中修改数据时将发出警告消息:

createtriggert1ondepts

forupdate

raiserror('

警告!

'

10,1)

当使用update语句修改Depts表中数据时,将在消息栏显示“警告!

”消息。

3.12假设教学数据库中有三个表,其数据结构如下:

学生表S(学号SNO,SNAME,年龄AGE,性别SEX);

选修表SC(学号SNO,课程号CNO,成绩GRADE);

课程表C(课程号CNO,课程名CNAME,任课教师TEACHER);

试用基本的SELECT语句表达下列操作:

①检索选修课程号为C06的学生学号与成绩。

②检索选修课程号为C06的学生学号与。

③检索选修课程名为ENGLISH的学生学号与。

④检索选修课程号为C08或C12的学生学号与成绩。

⑤检索至少选修课程号为C08和C12的学生学号与成绩。

⑥检索没有选修C02号课程的学生与年龄。

⑦检索选修了全部课程的学生。

⑧检索选修课程中包含了学生S05所学课程的学生学号。

⑨求女学生的总人数和平均年龄。

⑩统计选修了课程的学生人数。

selectsno,grade

fromsc

whereo='

c06'

第1种查询方法——连接查询:

SELECTs.sno,sname

FROMs,sc

WHEREs.sno=sc.snoando='

;

第2种查询方法——嵌套查询:

SELECTsno,sname

FROMs

WHEREsnoin

(SELECTsno

FROMsc

WHEREo='

);

嵌套查询(使用相关查询):

WHERE'

in

(SELECTo

WHEREsno=s.sno);

第3种查询方法——使用存在量词的嵌套查询:

SELECTsno,sname

WHEREexists(SELECT*

WHEREs.sno=sc.snoando='

嵌套查询:

(SELECTsno

FROMsc

WHEREoin

FROMc

WHEREame='

ENGLISH'

));

连接查询:

FROMs,c,sc

WHEREs.sno=sc.snoando=oandame='

english'

;

SELECT*

FROMsc

WHEREo='

C08'

oro='

C12'

注:

这里输出选修表sc的所有列,除学生学号与成绩外,还有选课的课程号。

若某个学生同时选修了C08和C12两门课程,可通过选课的课程号予以区分。

SELECTA.sno,A.grade,B.grade

FROMscASA,scASB

WHEREA.sno=B.snoandA.cno='

andB.cno='

;

SELECTsname,age

WHEREsnonotin

(SELECTo

FROMc

C02'

));

若把最外层的WHERE子句由“notin”改为“notexists”,则代码如下:

WHEREnotexists

(SELECTsno

WHEREs.sno=sc.snoandoin

(SELECT*

WHEREnotexists

WHEREs.sno=sc.sno

ando=o));

SELECTDISTINCTsno

WHEREsno<

>

S05'

andoin

WHEREsno='

);

SELECTcount(*)as总人数,avg(age)as平均年龄

WHEREsex='

女'

selectcount(distinctsno)as选课人数

3.13对习题3.12给出的表,用完整的SELECT语句或使用限定等方式表达下列操作:

①统计每一年龄选修课程的学生人数。

②求S表中男学生的每一年龄组(超过3人)的人数;

查询结果按人数升序排列,若人数相同按年龄降序排列。

③检索女学生选修的所有课程号。

④检索每个学生的出生年份,输出学生和出生年份分别用新列名:

XM,CSNF。

⑤检索18~20岁且以字符L打头的学生。

⑥检索至少没有选修C02和C03两门课程的学生学号。

⑦检索选修表SC中平均成绩最高的学生学号。

⑧检索出每门课程的最高分和最低分。

⑨使用COMPUTE子句生成Students表中Weight列的和及平均值。

⑩建立另一个Students1表,求Students表与Students1表的并集、差集、交集。

selectageas年龄,count(distincts.sno)as人数

froms,sc

wheres.sno=sc.sno

groupbyage

wheres.sno=sc.snoandsex='

男'

havingcount(distincts.sno)>

3

orderby2,agedesc

selectdistinctoas课程号

XM,CSNF。

selectsnameasXM,year(getdate())-ageasCSNF

froms

selectsname

whereagebetween18and20andsnamelike'

L%'

SELECTsno

WHEREsnonotin

(SELECTA.sno

FROMscASA,scASB

WHEREA.sno=B.snoandA.cno='

C03'

selectsnoas学号,mas最高平均分

from(SELECTsno,m=avg(grade)FROMscGROUPBYsno)asA

wherem>

=all

(SELECTavg(grade)FROMscGROUPBYsno)

selectoas课程号,min(grade)as最高分,max(grade)as最低分

groupbyo

computesum(weight),avg(weight)

/*并集*/

union

fromstudent1

/*差集*/

wheresnonotin

(selectsno

fromstudent1)

/*交集*/

selectstudents.*

fromstudentsINNERJOINstudent1ONstudents.sno=student1.sno;

3.14对于如下关系模式:

雇员表EMP(雇员编号EID,ENAME,出生年月BDATE,性别SEX,居住城市CITY);

公司表COMP(公司编号CID,公司名称CNAME,公司所在城市CITY);

工作表WORKS(雇员编号EID,公司编号CID,加入公司日期STARTDATE,薪酬SALARY);

试用SQL完成下列操作:

①检索出所有为“IBM公司”工作的雇员名字。

②检索出所有年龄超过50岁的女性雇员的和所在公司的名称。

③检索出所有居住城市与公司所在城市相同的雇员。

④检索出“IBM公司”雇员的人数,平均工资,最高工资和最低工资,并且分别用E#,AVG_SAL,MAX_SAL,MIN_SAL作为列标题。

⑤检索同时在“IBM公司”和“SAP公司”兼职的雇员名字。

⑥检索出工资高于其所在公司雇员平均工资的所有雇员。

⑦检索雇员最多的公司。

⑧为工龄超出10年的雇员加薪10%。

⑨年龄大于60岁的雇员应办理退休手续,删除退休雇员的所有相关记录。

⑩“IBM公司”增加某新雇员,将该雇员有关的记录插入到EMP表和WORKS表中,假设新进雇员薪酬未定,暂以空值表示。

selectENAME

fromEMP

whereEIDin

(selectEID

fromWORKS

whereCIDin

(selectCID

fromCOMP

whereCNAME='

IBM公司'

))

本题的检索可以使用多种不同的形式,例如:

fromEMP,WORKS,COMP

whereCOMP.CNAME='

AND

COMP.CID=WORKS.CIDAND

WORKS.EID=EMP.EID

selectENAME,COMP.CNAME

whereyear(getdate())-year(EMP.BDATE)>

50AND

EMP.SEX='

AND

EMP.EID=WORKS.EIDAND

WORKS.CID=COMP.CID

selectENAME,EMP.CITY,COMP.CITY

whereEMP.CITY=COMP.CITYAND

selectCOUNT(EID)ASE#,AVG(SALARY)ASAVG_SAL,

MAX(SALARY)ASMAX_SAL,MIN(SALARY)ASMIN_SAL

fromWORKS,COMP

whereCOMP.CNAME='

ANDCOMP.CID=WORKS.CID

selectEID,ENAME

whereEIDIN

whereCIDIN

whereCNAME='

orCNAME='

SAP公司'

selectEIDas雇员编号,ENAMEas

(selectB.EID

from(selectCID,M=avg(SALARY)fromWORKSgroupbyCID)asA,WORKSasB

whereA.CID=B.CIDandB.SALARY>

A.M)

selectCIDas公司编号,CNAMEas公司名称

fromCOMP

whereCIDin

from(selectCID,M=COUNT(EID)fromWORKSgroupbyCID)asA

whereM>

(selectCOUNT(EID)fromWORKSgroupbyCID))

updateWORKS

setSALARY=SALARY*1.1

whereyear(getdate())-year(STARTDATE)>

10

deleteEMP

whereyear(getdate())-year(BDATE)>

60

⑩“IBM公司”增加某新雇员,将该雇员有关的记录插入到EMP表和W

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 起诉状

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1