大三 sql 课后习题答案.docx
《大三 sql 课后习题答案.docx》由会员分享,可在线阅读,更多相关《大三 sql 课后习题答案.docx(40页珍藏版)》请在冰豆网上搜索。
大三sql课后习题答案
第二章
3.上机练习题
02程序代码如下:
CREATEDATABASESTUDENT1
ONPRIMARY
(NAME=STUDENT1_data,
FILENAME='E:
\DATA\STUDENT1.mdf',
SIZE=3,
MAXSIZE=unlimited,
FILEGROWTH=15%)
LOGON
(NAME=STUDENT1_log,
FILENAME='E:
\DATA\STUDENT1.ldf',
SIZE=2,
MAXSIZE=30,
FILEGROWTH=2)
03程序代码如下:
createdatabasestudents
onprimary
(name=students1,
filename='E:
\DATA\students1.mdf',
size=5,
maxsize=75,
filegrowth=10%),
(name=students12,
filename='E:
\DATA\students2.ndf',
size=10,
maxsize=75,
filegrowth=1)
logon
(name=studentslog1,
filename='E:
\DATA\studentslog1.ldf',
size=5,
maxsize=30,
filegrowth=1),
(name=studentslog2,
filename='E:
\DATA\studentslog2.ldf',
size=5,
maxsize=30,
filegrowth=1)
第三章:
3上机练习题
01程序代码如下:
--创建表book的Transact-SQL语句:
USEtest01
GO
CREATETABLEbook(
book_idnchar(6)NOTNULL,
book_namenchar(30)NULL,
pricenumeric(10,2)NULL,
CONSTRAINTPK_bookPRIMARYKEYCLUSTERED
(
book_idASC)
)ONPRIMARY
--创建表uthor的Transact-SQL语句:
CREATETABLEdbo.author(
anthor_namenchar(4)NOTNULL,
book_idnchar(6)NOTNULL,
addressnchar(30)NOTNULL
)ON[PRIMARY]
--设置book中的book_id为主键,author表中的book_id为外键
ALTERTABLEdbo.authorWITHCHECK
ADDCONSTRAINTFK_book_authorFOREIGNKEY(book_id)
REFERENCESdbo.book(book_id)
02程序代码如下:
--利用Transact-SQL语句创建表booksales的代码。
USEtest01
GO
CREATETABLEbooksales(
book_idnchar(6)NOTNULL,
sellnumintNOTNULL,
selldatedatetimeNOTNULL
)ONPRIMARY
--利用insert语句为表booksales添加数据:
INSERTINTObooksalesVALUES('m00011',7,20/12/2008)
INSERTINTObooksales(book_id,sellnum,selldate)VALUES('m00017',3,17/11/2008)
--利用update语句为表booksales更新数据:
UPDATEbooksalesSETsellnum=11
WHEREbook_id='m00011'
--利用delete语句删除表booksales的数据:
DELETEFROMbooksales
WHEREbook_id='m00011'
03程序代码如下:
USEtest01
GO
CREATERULEsellnum_rule
ASsellnum>=0
EXECsp_bindrule'sellnum_rule','booksales.sellnum'
04程序代码如下:
--删除年以前的数据
DELETEFROMbooksales
WHEREselldate<'1/1/2009'
--删除所有数据
TruncateTablebooksales
第四章
3上机练习题
01程序代码如下:
DECLAREbooknamenchar(16)
setbookname='SQLServer数据库编程'
02程序代码如下:
USEtest01
GO
SETNOCOUNTON
DECLAREstartdatedatetime,enddatedatetime
SETstartdate='1/7/200812:
12AM'
SETenddate='11/10/200912:
00AM'
SELECTDATEDIFF(year,startdate,enddate)
SELECTDATEDIFF(month,startdate,enddate)
SELECTDATEDIFF(day,startdate,enddate)
SELECTDATEDIFF(minute,startdate,'1/8/200712:
17AM')
SELECTDATEDIFF(minute,startdate,GETDATE())
SETNOCOUNTOFF
GO
03程序代码如下:
DECLAREcountINT,SUMINT
SETcount=51
SETSUM=0
WHILEcount<=100
BEGIN
IF(CEILING(count/3.0)<=FLOOR(count/3.0))
BEGIN
SETSUM=SUM+count
END
SETcount=count+2
END
PRINT'50到之间的所有能被整除的奇数之和'+CAST(SUMASNCHAR(4))
第五章
3上机练习题
01程序代码如下:
--查询course表中的所有记录。
useteaching
go
select*fromcourse
go
02程序代码如下:
--查询student表中的女生的人数。
useteaching
go
select*fromstudent
wheresex='女'
go
03程序代码如下:
--查询teacher表中每一位教授的教师号、和专业名称。
useteaching
go
selectteacherno,tname,majorfromteacher
whereprof='教授'
go
04程序代码如下:
--按性别分组,求出student表中的每组学生的平均年龄。
useteaching
go
selectsexas'学生性别',avg(DATEDIFF(year,birthday,getdate()))as'平均年龄'
fromstudent
groupbysex
go
05程序代码如下:
--利用现有的表生成新表,新表中包括学号、学生、课程号和总评成绩。
--其中:
总评成绩=final*0.8+usually*0.2
useteaching
go
selectstudent.studentno,student.sname,score.courseno,final*0.8+usually*0.2as'总评'
intostu_sorse
fromstudent,score
wherestudent.studentno=score.studentno
go
select*fromstu_sorse
go
06程序代码如下:
--统计每个学生的期末成绩平均分。
useteaching
go
selectstudentno,sname,avg(总评)
fromstu_sorse
groupbystudentno,sname
go
07程序代码如下:
--输出student表中年龄最大的男生的所有信息。
useteaching
go
select*fromstudent
wherebirthday=
(selectmin(birthday)
fromstudent)
go
08程序代码如下:
--查询teacher表中没有职称的职工的教师号、、专业和部门。
useteaching
go
selectteacherno,tname,major,department
fromteacher
whereprofisNULL
go
第六章
3上机练习题
01程序代码如下:
--查询每一位教授的教师号、和讲授的课程名称。
useteaching
go
selectteacher.teacherno,tname,major,ame
fromteacher,course,teach_class
whereprof='教授'andteacher.teacherno=teach_class.teacherno
andteach_class.courseno=course.courseno
go
02程序代码如下:
--利用现有的表生成新表,新表中包括学号、学生、课程名称和总评成绩。
--其中:
总评成绩=final*0.9+usually*0.1
useteaching
go
selectDISTINCTstudent.studentno,student.sname,ame,score.final*0.9+score.usually*0.1as'总评'
intostu_course
fromstudent,course,teach_class,score
wherestudent.studentno=score.studentno
andcourse.courseno=score.courseno
go
03程序代码如下:
--统计每个学生的期末成绩高于分的课程门数。
useteaching
go
selectstudent.studentno,student.sname,count(*)as'课程门数'
fromstudent,score
wherescore.final>75
andstudent.studentno=score.studentno
groupbystudent.studentno,student.sname
go
04程序代码如下:
--输出student表中年龄大于女生平均年龄的男生的所有信息。
useteaching
go
select*fromstudent
wheresex='男'
andDATEDIFF(year,birthday,getdate())>(
selectavg(DATEDIFF(year,birthday,getdate()))
fromstudent
wheresex='女')
go
05程序代码如下:
--计算每个学生获得的学分。
useteaching
go
selectstudent.studentno,student.sname,sum(credit)
fromstudentINNERJOINscore
ONstudent.studentno=score.studentno
INNERJOINcourse
ONcourse.courseno=score.courseno
wherescore.final>60
groupbystudent.studentno,student.sname
go
06程序代码如下:
--获取入学时间在年到年的所有学生中入学年龄小于岁的学号、及所修课程的课程名称。
useteaching
go
selectstudent.studentno,student.sname,stu_ame
fromstudentinnerjoinstu_course
onstudent.studentno=stu_course.studentno
where(substring(student.studentno,1,2)='08'and(datediff(year,birthday,'2008-01-01')<19))
or(substring(student.studentno,1,2)='09'and(datediff(year,birthday,'2009-01-01')<19))
go
07程序代码如下:
--查询级学生的学号、、课程名及学分。
useteaching
go
selectstudent.studentno,student.sname,stu_ame
fromstudentinnerjoinstu_course
onstudent.studentno=stu_course.studentno
wheresubstring(student.studentno,1,2)='09'
go
08程序代码如下:
--查询选修课程的少于门、或期末成绩含有分以下课程的学生的学号、、和Email。
useteaching
go
selectstudentno,count(*)as'countNUM'
intocount1
fromscore
groupbystudentno
GO
selectstudent.studentno,sname,phone,Email
fromstudentinnerjoinscore
onstudent.studentno=score.studentno
innerjoincount1
onstudent.studentno=count1.studentno
wherescore.final<60andcountNUM<3
go
第七章
3上机题练习
01程序代码如下:
--在course表的cname列上创建非聚集索引IDX_cname。
USEteaching
GO
CREATENONCLUSTEREDINDEXIDX_cnameONcourse(cname)
GO
02程序代码如下:
USEteaching
GO
IFEXISTS(SELECTnameFROMsysindexesWHEREname='UQ_stu')
DROPINDEXstudent.UQ_stu
GO
CREATENONCLUSTEREDINDEXUQ_stuONstudent(studentno,classno)
GO
SELECT*FROMstudent
03程序代码如下:
USEteaching
GO
ALTERINDEXUQ_stuONstudentREBUILD
WITH(PAD_INDEX=ON,FILLFACTOR=80)
GO
04程序代码如下:
--创建一个视图v_teacher,查询所有“计算机学院”教师的信息。
USEteaching
GO
CREATEVIEWv_teacher
AS
SELECT*
FROMteacher
WHEREdepartment='计算机学院'
GO
SELECT*FROMv_teacher
05程序代码如下:
--创建一个视图v_avgstu,查询每个学生的学号、及平均分,并且按照平均分降序排序。
USEteaching
GO
CREATEVIEWv_avgstu
AS
SELECTTOP(100)PERCENTstudent.studentno,student.sname,AVG(score.final)AS'average'
FROMstudent,score
WHEREstudent.studentno=score.studentnoANDscore.finalISNOTNULL
GROUPBYstudent.studentno,student.sname
ORDERBYAVG(score.final)DESC
GO
SELECT*FROMv_avgstu
06程序代码如下:
--修改v_teacher的视图定义,添加WITHCHECKOPTION选项。
USEteaching
GO
ALTERVIEWv_teacher
AS
SELECT*
FROMteacher
WHEREdepartment='计算机学院'
WITHCHECKOPTION
GO
07程序代码如下:
--通过视图v_teacher向基本表teacher中分别插入数据('05039','馨月','计算机应用','讲师','计算机学院')和('06018','诚','机械制造','副教授','机械学院'),并查看插入数据情况。
USEteaching
GO
INSERTINTOv_teacherVALUES('05039','馨月','计算机应用','讲师','计算机学院')
INSERTINTOv_teacherVALUES('06018','诚','机械制造','副教授','机械学院')
GO
SELECT*FROMv_teacher
SELECT*FROMteacher
08程序代码如下:
--通过视图v_teacher将基本表teacher中教师编号为'05039'的教师职称修改为'副教授'。
USEteaching
GO
UPDATEv_teacher
SETprof='副教授'
WHEREteacherno='05039'
GO
SELECT*FROMteacher
第八章
3上机练习题
01程序代码如下:
--创建一个名称为StuInfo的存储过程,要求完成以下功能:
--在student表中查询级学生的学号、、性别、出生日期和个字段的容
USEteaching
--查询是否已存在此存储过程,如果存在,就删除它
IFEXISTS(SELECTnameFROMsysobjects
WHEREname='StuInfo'ANDtype='P')
DROPPROCEDUREStuInfo
GO
--创建存储过程
CREATEPROCEDUREStuInfo
AS
Selectstudentno,sname,sex,birthday,phone
FROMstudent
WHEREsubstring(studentno,1,2)='08'
GO
02程序代码如下:
--创建一个存储过程ScoreInfo,
--完成的功能是在表student、表course和表score中查询以下字段:
学号、、性别、课程名称、期末分数。
USEteaching
--查询是否已存在此存储过程,如果存在,就删除它
IFEXISTS(SELECTnameFROMsysobjects
WHEREname='ScoreInfo'ANDtype='P')
DROPPROCEDUREScoreInfo
GO
--创建存储过程
CREATEPROCEDUREScoreInfo
AS
Selectstudent.studentno,student.sname,student.sex,ame,Score.final
FROMstudent,course,score
WHEREstudent.studentno=score.studentno
andscore.courseno=course.courseno
GO
03程序代码如下:
--创建一个带有参数的存储过程Stu_Age,
--该存储过程根据输入的学号,在student表中计算此学生的年龄,
--并根据程序的执行结果返回不同的值,程序执行成功,返回整数,如果执行出错,则返回错误号。
--删除已存在的存储过程
USEteaching
IFEXISTS(SELECTnameFROMsysobjects
WHEREname='Stu_Age'ANDtype='P')
DROPPROCEDUREStu_Age
GO
--创建存储过程
USEteaching
GO
CREATEPROCEDUREStu_Age
studentNOnvarchar(10),AgeintOUTPUT
AS
--定义并初始化局部变量,用于保存返回值
DECLAREErrorValueint
SETErrorValue=0
--求此学生的年龄
SELECTAge=YEAR(GETDATE())-YEAR(birthday)
FROMstudent
WHEREstudentno=studentNO
--根据程序的执行结果返回不同的值
IF(ERROR<>0)
SETErrorValue=ERROR
RETURNErrorValue
GO
04程序代码如下:
--================================================
--TemplategeneratedfromTemplateExplorerusing:
--CreateTrigger(NewMenu).SQL
--
--UsetheSpecifyValuesforTemplateParameters
--command(Ctrl-Shift-M)tofillintheparameter
--valuesbelow.
--
--SeeadditionalCreateTriggertemplatesformore
--examplesofdiffe