1、数据库第五次作业实验七 数据库的连接和嵌套查询实验实验十 T-SQL语句的综合应用一 实验目的和要求: 掌握变量的定义及赋值、数据显示及IF、WHILE、CASE逻辑控制语句。 实验类型:设计 验证 实验内容:创建学员成绩数据库stu。实验目的和要求: 掌握简单子查询、IN子查询及EXISTS子查询的用法,并能应用T-SQL进行综合查询。 实验类型:设计 验证CREATE TABLE STUINFO(stuName char(9),stoNo char(9) primary key,stuSex char(2) check(stuSex in(男,女),stuage int,stuSeat c
2、har(2),stuAddress varchar(20),)CREATE TABLE STUMARKS(ExamNo char(9),stuNO char(9),writtenExam numeric(5,2),LabExam numeric(5,2),Primary key(ExamNo,stuNo),Foreign key(stuno)references STUINFO(stoNo),)输入数据:insert into STUINFO values(张秋丽,s25301,男,18,1,北京海淀)insert into STUINFO values(李文才,s25302,男,28,2,地
3、址不详)insert into STUINFO values(李斯文,s25303,女,22,3,河南洛阳)insert into STUINFO values(欧阳俊雄,s25304,女,34,4,地址不详)insert into STUINFO values(梅超风,s25318,女,23,5,地址不详)insert into STUMARKS values(s,s25303,80,58)insert into STUMARKS values(s,s25302,50,90)insert into STUMARKS values(s,s25301,77,82)insert into STUM
4、ARKS values(s,s25328,45,65)试编写SQL语句查找李文才的左右同桌。set name=李文才select stuSeat =id from STUINFOwhere stuName =nameselect * from STUINFOwhere (id = stuSeat -1) or (id = stuSeat +1)go二 统计并显示本班笔试平均分,如果平均分在70以上,显示“成绩优秀“,并显示前三名学员的考试信息;如果在70以下,显示“本班成绩较差“,并显示后三名学员的考试信息DECLARE myavg floatSELECT myavg=AVG(writtenE
5、xam) FROM STUMarksprint 本班平均分+convert(varchar(5),myavg)if(myavg70)BEGIN print 本班笔试成绩优秀,前三名的成绩为: SELECT TOP 3 * FROM stuMarks ORDER BY writtenExam DESCENDELSEBEGIN print 本班笔试成绩较差,后三名的成绩为: SELECT TOP 3 * FROM stuMarks ORDER BY writtenExamEND三 本次考试成绩较差,假定要提分,确保每人笔试都通过。提分规则很简单,先每人都加2分,看是否都通过,如果没有全部通过,每人
6、再加2分,再看是否都通过,如此反复提分,直到所有人都通过为止 。DECLARE n intWHILE(1=1) BEGIN SELECT n=COUNT(*) FROM stuMarks WHERE writtenExam0) UPDATE STUMarks SET writtenExam=writtenExam+2 ELSE BREAK ENDprint 加分后的成绩如下:SELECT * FROM STUMarks四 采用美国的ABCDE五级打分制来显示笔试成绩。 A级: 90分以上 B级: 8089分 C级: 7079分 D级: 6069分 E级: 60分以下print ABCDE五级显
7、示成绩如下:SELECT stuNo, 成绩= CASE WHEN writtenExam=60 and labExam=60 THEN 1 ELSE 0 END INTO newTable FROM STUINFO LEFT JOIN STUMARKS ON STUINFO.stuNo= STUMARKS.stuNo -SELECT * FROM newTable -查看统计结果,可用于调试 /*-酌情加分:比较笔试和机试平均分,决定加哪门-*/DECLARE avgWritten numeric(4,1)DECLARE avgLab numeric(4,1) SELECT avgWritt
8、en=AVG(writtenExam) FROM newTable WHERE writtenExam IS NOT NULLSELECT avgLab=AVG(labExam)FROM newTable WHERE labExam IS NOT NULLIF avgWritten=97 BREAK ENDELSEIF avgWrittenavgLab WHILE (1=1) -循环给笔试加分,最高分不能超过97分 BEGIN UPDATE newTable SET LabExam=LabExam+1 IF (SELECT MAX(LabExam) FROM newTable )=97 BRE
9、AK END -因为提分,所以需要更新isPass(是否通过)列的数据UPDATE newTable SET isPass=CASE WHEN writtenExam=60 and labExam=60 THEN 1 ELSE 0 END-SELECT * FROM newTable -可用于调试/*-显示考试最终通过情况-*/SELECT 姓名=stuName,学号=stuNo ,笔试成绩=CASE WHEN writtenExam IS NULL THEN 缺考 ELSE convert(varchar(5),writtenExam) END ,机试成绩=CASE WHEN labExam IS NULL THEN 缺考 ELSE convert(varchar(5),labExam) END ,是否通过=CASE WHEN isPass=1 THEN 是 ELSE 否 END FROM newTable /*-显示通过率及通过人数-*/ SELECT 总人数=count(*) ,通过人数=SUM(isPass), 通过率=(convert(varchar(5),AVG(isPass*100)+%) FROM newTable