您的位置:首页 > 数据库

SQL常考笔试题

2011-10-21 20:01 176 查看
(一)
1.写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的。)selecttop10*fromAwhereidnotin(selecttop30idfromA)解2:selecttop10*fromAwhereid>(selectmax(id)from(selecttop30idfromA)asA)
2.写sql语句实现下列查询(表)tab(列)121314212231415352查询结果要求ab1221314152
3.一组通话记录(总共500万条):ID主叫号码被叫号码通话起始时间通话结束时间通话时长19829000002154665466562007-02-0109:49:53.0002007-02-0109:50:16.000232982900000215466546662007-02-0109:50:29.0002007-02-0109:50:41.000123982900000215466546662007-02-0109:50:58.0002007-02-0109:51:12.0001446829090007551333298662007-02-0110:04:31.0002007-02-0110:07:13.00016257829000007552557086382007-02-0110:48:26.0002007-02-0110:49:23.0005767829000007558211191092007-02-0110:49:39.0002007-02-0110:52:55.0001967782900000357309283702007-02-0111:30:45.0002007-02-0111:31:58.0007387829000008711388899042007-02-0111:33:47.0002007-02-0111:35:00.000739682900000357309283792007-02-0111:52:20.0002007-02-0111:54:56.000156106829000002985218111992007-02-0112:44:45.0002007-02-0112:45:04.00019求其中同一个号码的两次通话之间间隔大于10秒的通话记录ID例如:6,7,8,9,10条记录均符合。
(二)
Student(S#,Sname,Sage,Ssex)学生表Course(C#,Cname,T#)课程表SC(S#,C#,score)成绩表Teacher(T#,Tname)教师表
问题:1、查询“001”课程比“002”课程成绩高的所有学生的学号;selecta.S#from(selects#,scorefromSCwhereC#='001')a,(selects#,scorefromSCwhereC#='002')bwherea.score>b.scoreanda.s#=b.s#;2、查询平均成绩大于60分的同学的学号和平均成绩;selectS#,avg(score)fromscgroupbyS#havingavg(score)>60;3、查询所有同学的学号、姓名、选课数、总成绩;selectStudent.S#,Student.Sname,count(SC.C#),sum(score)fromStudentleftOuterjoinSConStudent.S#=SC.S#groupbyStudent.S#,Sname4、查询姓“李”的老师的个数;selectcount(distinct(Tname))fromTeacherwhereTnamelike'李%';5、查询没学过“叶平”老师课的同学的学号、姓名;selectStudent.S#,Student.SnamefromStudentwhereS#notin(selectdistinct(SC.S#)fromSC,Course,TeacherwhereSC.C#=Course.C#andTeacher.T#=Course.T#andTeacher.Tname='叶平');6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;selectStudent.S#,Student.SnamefromStudent,SCwhereStudent.S#=SC.S#andSC.C#='001'andexists(Select*fromSCasSC_2whereSC_2.S#=SC.S#andSC_2.C#='002');7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;selectS#,SnamefromStudentwhereS#in(selectS#fromSC,Course,TeacherwhereSC.C#=Course.C#andTeacher.T#=Course.T#andTeacher.Tname='叶平'groupbyS#havingcount(SC.C#)=(selectcount(C#)fromCourse,TeacherwhereTeacher.T#=Course.T#andTname='叶平'));8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;SelectS#,Snamefrom(selectStudent.S#,Student.Sname,score,(selectscorefromSCSC_2whereSC_2.S#=Student.S#andSC_2.C#='002')score2fromStudent,SCwhereStudent.S#=SC.S#andC#='001')S_2wherescore2<score;9、查询所有课程成绩小于60分的同学的学号、姓名;selectS#,SnamefromStudentwhereS#notin(selectStudent.S#fromStudent,SCwhereS.S#=SC.S#andscore>60);10、查询没有学全所有课的同学的学号、姓名;selectStudent.S#,Student.SnamefromStudent,SCwhereStudent.S#=SC.S#groupbyStudent.S#,Student.Snamehavingcount(C#)<(selectcount(C#)fromCourse);11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;selectS#,SnamefromStudent,SCwhereStudent.S#=SC.S#andC#inselectC#fromSCwhereS#='1001';12、查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名;selectdistinctSC.S#,SnamefromStudent,SCwhereStudent.S#=SC.S#andC#in(selectC#fromSCwhereS#='001');13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;updateSCsetscore=(selectavg(SC_2.score)fromSCSC_2whereSC_2.C#=SC.C#)fromCourse,TeacherwhereCourse.C#=SC.C#andCourse.T#=Teacher.T#andTeacher.Tname='叶平');14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名;selectS#fromSCwhereC#in(selectC#fromSCwhereS#='1002')groupbyS#havingcount(*)=(selectcount(*)fromSCwhereS#='1002');15、删除学习“叶平”老师课的SC表记录;DelectSCfromcourse,TeacherwhereCourse.C#=SC.C#andCourse.T#=Teacher.T#andTname='叶平';16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、2、号课的平均成绩;InsertSCselectS#,'002',(Selectavg(score)fromSCwhereC#='002')fromStudentwhereS#notin(SelectS#fromSCwhereC#='002');17、按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示:学生ID,,数据库,企业管理,英语,有效课程数,有效平均分SELECTS#as学生ID,(SELECTscoreFROMSCWHERESC.S#=t.S#ANDC#='004')AS数据库,(SELECTscoreFROMSCWHERESC.S#=t.S#ANDC#='001')AS企业管理,(SELECTscoreFROMSCWHERESC.S#=t.S#ANDC#='006')AS英语,COUNT(*)AS有效课程数,AVG(t.score)AS平均成绩FROMSCAStGROUPBYS#ORDERBYavg(t.score)18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分SELECTL.C#As课程ID,L.scoreAS最高分,R.scoreAS最低分FROMSCL,SCASRWHEREL.C#=R.C#andL.score=(SELECTMAX(IL.score)FROMSCASIL,StudentASIMWHEREL.C#=IL.C#andIM.S#=IL.S#GROUPBYIL.C#)ANDR.Score=(SELECTMIN(IR.score)FROMSCASIRWHERER.C#=IR.C#GROUPBYIR.C#);19、按各科平均成绩从低到高和及格率的百分数从高到低顺序SELECTt.C#AS课程号,max(course.Cname)AS课程名,isnull(AVG(score),0)AS平均成绩,100*SUM(CASEWHENisnull(score,0)>=60THEN1ELSE0END)/COUNT(*)AS及格百分数FROMSCT,Coursewheret.C#=course.C#GROUPBYt.C#ORDERBY100*SUM(CASEWHENisnull(score,0)>=60THEN1ELSE0END)/COUNT(*)DESC20、查询如下课程平均成绩和及格率的百分数(用"1行"显示):企业管理(001),马克思(002),OO&UML(003),数据库(004)SELECTSUM(CASEWHENC#='001'THENscoreELSE0END)/SUM(CASEC#WHEN'001'THEN1ELSE0END)AS企业管理平均分,100*SUM(CASEWHENC#='001'ANDscore>=60THEN1ELSE0END)/SUM(CASEWHENC#='001'THEN1ELSE0END)AS企业管理及格百分数,SUM(CASEWHENC#='002'THENscoreELSE0END)/SUM(CASEC#WHEN'002'THEN1ELSE0END)AS马克思平均分,100*SUM(CASEWHENC#='002'ANDscore>=60THEN1ELSE0END)/SUM(CASEWHENC#='002'THEN1ELSE0END)AS马克思及格百分数,SUM(CASEWHENC#='003'THENscoreELSE0END)/SUM(CASEC#WHEN'003'THEN1ELSE0END)ASUML平均分,100*SUM(CASEWHENC#='003'ANDscore>=60THEN1ELSE0END)/SUM(CASEWHENC#='003'THEN1ELSE0END)ASUML及格百分数,SUM(CASEWHENC#='004'THENscoreELSE0END)/SUM(CASEC#WHEN'004'THEN1ELSE0END)AS数据库平均分,100*SUM(CASEWHENC#='004'ANDscore>=60THEN1ELSE0END)/SUM(CASEWHENC#='004'THEN1ELSE0END)AS数据库及格百分数FROMSC
21、查询不同老师所教不同课程平均分从高到低显示SELECTmax(Z.T#)AS教师ID,MAX(Z.Tname)AS教师姓名,C.C#AS课程ID,MAX(C.Cname)AS课程名称,AVG(Score)AS平均成绩FROMSCAST,CourseASC,TeacherASZwhereT.C#=C.C#andC.T#=Z.T#GROUPBYC.C#ORDERBYAVG(Score)DESC22、查询如下课程成绩第3名到第6名的学生成绩单:企业管理(001),马克思(002),UML(003),数据库(004)[学生ID],[学生姓名],企业管理,马克思,UML,数据库,平均成绩SELECTDISTINCTtop3SC.S#As学生学号,Student.SnameAS学生姓名,T1.scoreAS企业管理,T2.scoreAS马克思,T3.scoreASUML,T4.scoreAS数据库,ISNULL(T1.score,0)+ISNULL(T2.score,0)+ISNULL(T3.score,0)+ISNULL(T4.score,0)as总分FROMStudent,SCLEFTJOINSCAST1ONSC.S#=T1.S#ANDT1.C#='001'LEFTJOINSCAST2ONSC.S#=T2.S#ANDT2.C#='002'LEFTJOINSCAST3ONSC.S#=T3.S#ANDT3.C#='003'LEFTJOINSCAST4ONSC.S#=T4.S#ANDT4.C#='004'WHEREstudent.S#=SC.S#andISNULL(T1.score,0)+ISNULL(T2.score,0)+ISNULL(T3.score,0)+ISNULL(T4.score,0)NOTIN(SELECTDISTINCTTOP15WITHTIESISNULL(T1.score,0)+ISNULL(T2.score,0)+ISNULL(T3.score,0)+ISNULL(T4.score,0)FROMscLEFTJOINscAST1ONsc.S#=T1.S#ANDT1.C#='k1'LEFTJOINscAST2ONsc.S#=T2.S#ANDT2.C#='k2'LEFTJOINscAST3ONsc.S#=T3.S#ANDT3.C#='k3'LEFTJOINscAST4ONsc.S#=T4.S#ANDT4.C#='k4'ORDERBYISNULL(T1.score,0)+ISNULL(T2.score,0)+ISNULL(T3.score,0)+ISNULL(T4.score,0)DESC);
23、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[<60]SELECTSC.C#as课程ID,Cnameas课程名称,SUM(CASEWHENscoreBETWEEN85AND100THEN1ELSE0END)AS[100-85],SUM(CASEWHENscoreBETWEEN70AND85THEN1ELSE0END)AS[85-70],SUM(CASEWHENscoreBETWEEN60AND70THEN1ELSE0END)AS[70-60],SUM(CASEWHENscore<60THEN1ELSE0END)AS[60-]FROMSC,CoursewhereSC.C#=Course.C#GROUPBYSC.C#,Cname;
24、查询学生平均成绩及其名次SELECT1+(SELECTCOUNT(distinct平均成绩)FROM(SELECTS#,AVG(score)AS平均成绩FROMSCGROUPBYS#)AST1WHERE平均成绩>T2.平均成绩)as名次,S#as学生学号,平均成绩FROM(SELECTS#,AVG(score)平均成绩FROMSCGROUPBYS#)AST2ORDERBY平均成绩desc;25、查询各科成绩前三名的记录:(不考虑成绩并列情况)SELECTt1.S#as学生ID,t1.C#as课程ID,Scoreas分数FROMSCt1WHEREscoreIN(SELECTTOP3scoreFROMSCWHEREt1.C#=C#ORDERBYscoreDESC)ORDERBYt1.C#;26、查询每门课程被选修的学生数selectc#,count(S#)fromscgroupbyC#;27、查询出只选修了一门课程的全部学生的学号和姓名selectSC.S#,Student.Sname,count(C#)AS选课数fromSC,StudentwhereSC.S#=Student.S#groupbySC.S#,Student.Snamehavingcount(C#)=1;28、查询男生、女生人数Selectcount(Ssex)as男生人数fromStudentgroupbySsexhavingSsex='男';Selectcount(Ssex)as女生人数fromStudentgroupbySsexhavingSsex='女';29、查询姓“张”的学生名单SELECTSnameFROMStudentWHERESnamelike'张%';30、查询同名同性学生名单,并统计同名人数selectSname,count(*)fromStudentgroupbySnamehavingcount(*)>1;;31、1981年出生的学生名单(注:Student表中Sage列的类型是datetime)selectSname,CONVERT(char(11),DATEPART(year,Sage))asagefromstudentwhereCONVERT(char(11),DATEPART(year,Sage))='1981';32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列SelectC#,Avg(score)fromSCgroupbyC#orderbyAvg(score),C#DESC;33、查询平均成绩大于85的所有学生的学号、姓名和平均成绩selectSname,SC.S#,avg(score)fromStudent,SCwhereStudent.S#=SC.S#groupbySC.S#,Snamehavingavg(score)>85;34、查询课程名称为“数据库”,且分数低于60的学生姓名和分数SelectSname,isnull(score,0)fromStudent,SC,CoursewhereSC.S#=Student.S#andSC.C#=Course.C#andCourse.Cname='数据库'andscore<60;35、查询所有学生的选课情况;SELECTSC.S#,SC.C#,Sname,CnameFROMSC,Student,CoursewhereSC.S#=Student.S#andSC.C#=Course.C#;36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;SELECTdistinctstudent.S#,student.Sname,SC.C#,SC.scoreFROMstudent,ScWHERESC.score>=70ANDSC.S#=student.S#;37、查询不及格的课程,并按课程号从大到小排列selectc#fromscwherescore<60orderbyC#;38、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名;selectSC.S#,Student.SnamefromSC,StudentwhereSC.S#=Student.S#andScore>80andC#='003';39、求选了课程的学生人数selectcount(*)fromsc;40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩selectStudent.Sname,scorefromStudent,SC,CourseC,TeacherwhereStudent.S#=SC.S#andSC.C#=C.C#andC.T#=Teacher.T#andTeacher.Tname='叶平'andSC.score=(selectmax(score)fromSCwhereC#=C.C#);41、查询各个课程及相应的选修人数selectcount(*)fromscgroupbyC#;42、查询不同课程成绩相同的学生的学号、课程号、学生成绩selectdistinctA.S#,B.scorefromSCA,SCBwhereA.Score=B.ScoreandA.C#<>B.C#;43、查询每门功成绩最好的前两名SELECTt1.S#as学生ID,t1.C#as课程ID,Scoreas分数FROMSCt1WHEREscoreIN(SELECTTOP2scoreFROMSCWHEREt1.C#=C#ORDERBYscoreDESC)ORDERBYt1.C#;44、统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人数相同,按课程号升序排列selectC#as课程号,count(*)as人数fromscgroupbyC#orderbycount(*)desc,c#45、检索至少选修两门课程的学生学号selectS#fromscgroupbys#havingcount(*)>=246、查询全部学生都选修的课程的课程号和课程名selectC#,CnamefromCoursewhereC#in(selectc#fromscgroupbyc#)47、查询没学过“叶平”老师讲授的任一门课程的学生姓名selectSnamefromStudentwhereS#notin(selectS#fromCourse,Teacher,SCwhereCourse.T#=Teacher.T#andSC.C#=course.C#andTname='叶平');48、查询两门以上不及格课程的同学的学号及其平均成绩selectS#,avg(isnull(score,0))fromSCwhereS#in(selectS#fromSCwherescore<60groupbyS#havingcount(*)>2)groupbyS#;49、检索“004”课程分数小于60,按分数降序排列的同学学号selectS#fromSCwhereC#='004'andscore<60orderbyscoredesc;50、删除“002”同学的“001”课程的成绩deletefromScwhereS#='001'andC#='001';
(三)
问题描述:本题用到下面三个关系表:CARD借书卡。CNO卡号,NAME姓名,CLASS班级BOOKS图书。BNO书号,BNAME书名,AUTHOR作者,PRICE单价,QUANTITY库存册数BORROW借书记录。CNO借书卡号,BNO书号,RDATE还书日期备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。要求实现如下15个处理:1.写出建立BORROW表的SQL语句,要求定义主码完整性约束和引用完整性约束。2.找出借书超过5本的读者,输出借书卡号及所借图书册数。3.查询借阅了"水浒"一书的读者,输出姓名及班级。4.查询过期未还图书,输出借阅者(卡号)、书号及还书日期。5.查询书名包括"网络"关键词的图书,输出书号、书名、作者。6.查询现有图书中价格最高的图书,输出书名及作者。7.查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出。8.将"C01"班同学所借图书的还期都延长一周。9.从BOOKS表中删除当前无人借阅的图书记录。10.如果经常按书名查询图书信息,请建立合适的索引。11.在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是"数据库技术及应用",就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表)。12.建立一个视图,显示"力01"班学生的借书信息(只要求显示姓名和书名)。13.查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出。14.假定在建BOOKS表时没有定义主码,写出为BOOKS表追加定义主码的语句。15.对CARD表做如下修改:a.将NAME最大列宽增加到10个字符(假定原为6个字符)。b.为该表增加1列NAME(系名),可变长,最大20个字符。
1.写出建立BORROW表的SQL语句,要求定义主码完整性约束和引用完整性约束--实现代码:CREATETABLEBORROW(CNOintFOREIGNKEYREFERENCESCARD(CNO),BNOintFOREIGNKEYREFERENCESBOOKS(BNO),RDATEdatetime,PRIMARYKEY(CNO,BNO))
2.找出借书超过5本的读者,输出借书卡号及所借图书册数--实现代码:SELECTCNO,借图书册数=COUNT(*)FROMBORROWGROUPBYCNOHAVINGCOUNT(*)>5
3.查询借阅了"水浒"一书的读者,输出姓名及班级--实现代码:SELECT*FROMCARDcWHEREEXISTS(SELECT*FROMBORROWa,BOOKSbWHEREa.BNO=b.BNOANDb.BNAME=N'水浒'ANDa.CNO=c.CNO)
4.查询过期未还图书,输出借阅者(卡号)、书号及还书日期--实现代码:SELECT*FROMBORROWWHERERDATE<GETDATE()
5.查询书名包括"网络"关键词的图书,输出书号、书名、作者--实现代码:SELECTBNO,BNAME,AUTHORFROMBOOKSWHEREBNAMELIKEN'%网络%'
6.查询现有图书中价格最高的图书,输出书名及作者--实现代码:SELECTBNO,BNAME,AUTHORFROMBOOKSWHEREPRICE=(SELECTMAX(PRICE)FROMBOOKS)
7.查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出--实现代码:SELECTa.CNOFROMBORROWa,BOOKSbWHEREa.BNO=b.BNOANDb.BNAME=N'计算方法'ANDNOTEXISTS(SELECT*FROMBORROWaa,BOOKSbbWHEREaa.BNO=bb.BNOANDbb.BNAME=N'计算方法习题集'ANDaa.CNO=a.CNO)ORDERBYa.CNODESC
8.将"C01"班同学所借图书的还期都延长一周--实现代码:UPDATEbSETRDATE=DATEADD(Day,7,b.RDATE)FROMCARDa,BORROWbWHEREa.CNO=b.CNOANDa.CLASS=N'C01'
9.从BOOKS表中删除当前无人借阅的图书记录--实现代码:DELETEAFROMBOOKSaWHERENOTEXISTS(SELECT*FROMBORROWWHEREBNO=a.BNO)
10.如果经常按书名查询图书信息,请建立合适的索引--实现代码:CREATECLUSTEREDINDEXIDX_BOOKS_BNAMEONBOOKS(BNAME)
11.在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是"数据库技术及应用",就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表)--实现代码:CREATETRIGGERTR_SAVEONBORROWFORINSERT,UPDATEASIF@@ROWCOUNT>0INSERTBORROW_SAVESELECTi.*FROMINSERTEDi,BOOKSbWHEREi.BNO=b.BNOANDb.BNAME=N'数据库技术及应用'
12.建立一个视图,显示"力01"班学生的借书信息(只要求显示姓名和书名)--实现代码:CREATEVIEWV_VIEWASSELECTa.NAME,b.BNAMEFROMBORROWab,CARDa,BOOKSbWHEREab.CNO=a.CNOANDab.BNO=b.BNOANDa.CLASS=N'力01'
13.查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出--实现代码:SELECTa.CNOFROMBORROWa,BOOKSbWHEREa.BNO=b.BNOANDb.BNAMEIN(N'计算方法',N'组合数学')GROUPBYa.CNOHAVINGCOUNT(*)=2ORDERBYa.CNODESC
14.假定在建BOOKS表时没有定义主码,写出为BOOKS表追加定义主码的语句--实现代码:ALTERTABLEBOOKSADDPRIMARYKEY(BNO)
15.1将NAME最大列宽增加到10个字符(假定原为6个字符)--实现代码:ALTERTABLECARDALTERCOLUMNNAMEvarchar(10)
15.2为该表增加1列NAME(系名),可变长,最大20个字符--实现代码:ALTERTABLECARDADD系名varchar(20)
(四)
问题描述:为管理岗位业务培训信息,建立3个表:S(S#,SN,SD,SA)S#,SN,SD,SA分别代表学号、学员姓名、所属单位、学员年龄C(C#,CN)C#,CN分别代表课程编号、课程名称SC(S#,C#,G)S#,C#,G分别代表学号、所选修的课程编号、学习成绩
要求实现如下5个处理:1.使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名2.使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位3.使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位4.使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位5.查询选修了课程的学员人数6.查询选修课程超过5门的学员学号和所属单位
1.使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名--实现代码:SELECTSN,SDFROMSWHERE[S#]IN(SELECT[S#]FROMC,SCWHEREC.[C#]=SC.[C#]ANDCN=N'税收基础')
2.使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位--实现代码:SELECTS.SN,S.SDFROMS,SCWHERES.[S#]=SC.[S#]ANDSC.[C#]='C2'
3.使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位--实现代码:SELECTSN,SDFROMSWHERE[S#]NOTIN(SELECT[S#]FROMSCWHERE[C#]='C5')
4.使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位--实现代码:SELECTSN,SDFROMSWHERE[S#]IN(SELECT[S#]FROMSCRIGHTJOINCONSC.[C#]=C.[C#]GROUPBY[S#]HAVINGCOUNT(*)=COUNT(DISTINCT[S#]))
5.查询选修了课程的学员人数--实现代码:SELECT学员人数=COUNT(DISTINCT[S#])FROMSC
6.查询选修课程超过5门的学员学号和所属单位--实现代码:SELECTSN,SDFROMSWHERE[S#]IN(SELECT[S#]FROMSCGROUPBY[S#]HAVINGCOUNT(DISTINCT[C#])>5)
(五)
一SQLSERVER管理部分
1请讲出身份验证模式与登录帐号的关系及如何用各种帐号进行登录,并画出示意图2请讲出登录帐号、数据库用户及数据库角色之间的关系,并画出示意图3请讲出数据库用户、数据库角色与数据库对象之间的关系,并画出直接对用户授权与间接对用户授权(系统权限与对象权限)的方法4请讲出服务器角色、数据库角色、标准角色与应用程序角色的区别与验证其权限的方法5请讲出数据库还原模型对数据库的影响6有一个执行关键任务的数据库,请设计一个数据库备份策略7请使用文件与文件组恢复的方式恢复数据库8请使用事务日志恢复数据库到一个时间点9请设计作业进行周期性的备份数据库10如何监控数据库的阻塞,并实现数据库的死锁测试11如何监控数据库的活动,并能使用索引优化向导生成索引12理解数据库框图的作用并可以设计表与表之间的关系
1有订单表,需要实现它的编号,格式如下:200211030001……200222039999等
2有表T1,T2,现有一事务,在向表T1添加数据时,同时也必须向T2也添加数据,如何实现该事务
3如何向T1中的编号字段(codevarchar(20))添加一万条记录,不充许重复,规则如下:编号的数据必须从小写的a-z之间取值
4如何删除表中的重复数据,请使用游标与分组的办法
5如何求表中相邻的两条记录的某字段的值之差
6如何统计数据库中所有用户表的数据,显示格式如下:
表名记录数
sales23
7如何删除数据库中的所有用户表(表与表之间有外键关系)
8表Aeditor_idlb2_id123000123003123003456007456006表Blb2_idlb2_name000a003b006c007d显示a共1条(表A内lb2_id为000的条数)b共2条(表A内lb2_id为003的条数)
9人员情况表(employee):里面有一字段文化程度(wh):包括四种情况(本科以上,大专,高中,初中以下),现在我要根据年龄字段查询统计出:表中文化程度为本科以上,大专,高中,初中以下,各有多少人,占总人数多少。
SELECTwhAS学历,ageas年龄,Count(*)AS人数,
Count(*)*100/(SELECTCount(*)FROMemployee)AS百分比
FROMemployeeGROUPBYwh,age
学历年龄人数百分比
本科以上203414
大专203313
高中203313
初中以下2010040
本科以上215020
10现在有三个表student:(FID学生号,FName姓名),
subject:(FSubID课程号,FSubName课程名),
Score(FScoreId成绩记录号,FSubID课程号,FStdID学生号,FScore成绩)
怎么能实现这个表:
姓名英语数学语文历史
张萨78678976
王强89678496
SELECTa.FNameAS姓名,
英语=SUM(CASEb.FSubNameWHEN'英语'THENc.FScoreEND),
数学=SUM(CASEb.FSubNameWHEN'数学'THENc.FScoreEND),
语文=SUM(CASEb.FSubNameWHEN'语文'THENc.FScoreEND),
历史=SUM(CASEb.FSubNameWHEN'历史'THENc.FScoreEND)
FROMStudenta,Subjectb,Scorec
WHEREa.FID=c.FStdIdANDb.FSubID=c.FsubIDGROUPBYa.FName
11原始表的数据如下:
PIDPTimePNo
1111112003-01-2804:30:09
1111112003-01-2818:30:00
2222222003-01-2804:31:09
3333332003-01-2804:32:09
1111112003-02-0903:35:25
2222222003-02-0903:36:25
3333332003-02-0903:37:25
查询生成表
PDate111111222222333333......
2003-01-2804:30:0904:31:0904:32:09......
2003-01-2818:30:00
2003-02-0903:35:2503:36:2503:37:25......
12表一(AAA)
商品名称mc商品总量sl
A100
B120
表二(BBB)
商品名称mc出库数量sl
A10
A20
B10
B20
B30
用一条SQL语句算出商品A,B目前还剩多少?
declare@AAAtable(商品名称varchar(10),商品总量int)
insertinto@AAAvalues('A',100)
insertinto@AAAvalues('B',120)
declare@BBBtable(商品名称varchar(10),出库数量int)
insertinto@BBBvalues('A',10)
insertinto@BBBvalues('A',20)
insertinto@BBBvalues('B',10)
insertinto@BBBvalues('B',20)
insertinto@BBBvalues('B',30)
selectTA.商品名称,A-BAS剩余数量FROM
(select商品名称,sum(商品总量)ASA
from@AAA
groupby商品名称)TA,
(select商品名称,sum(出库数量)ASB
from@BBB
groupby商品名称)TB
whereTA.商品名称=TB.商品名称
select商品名称,sum(商品总量)剩余数量from(select*from@aaaunionallselect商品名称,-出库数量from@bbb)agroupby商品名称
13优化这句SQL语句
UPDATEtblExlTempYear
SETtblExlTempYear.GDQC=tblExlTempMonth.GDQC
FROMtblExlTempYear,tblExlTempMonth
wheretblExlTempMonth.GDXM=tblExlTempYear.GDXMandtblExlTempMonth.TXDZ=tblExlTempYear.TXDZ
(1)、加索引:
tblExlTempYear(GDXM,TXDZ)
tblExlTempMonth(GDXM,TXDZ)
(2)、删除无用数据
(3)、转移过时数据
(4)、加服务器内存,升级服务器
(5)、升级网络系统
UPDATEtblExlTempYear
SETtblExlTempYear.GDQC=tblExlTempMonth.GDQC
FROMtblExlTempYear(indexindexY),tblExlTempMonth(indexindexM)
wheretblExlTempMonth.GDXM=tblExlTempYear.GDXMandtblExlTempMonth.TXDZ=tblExlTempYear.TXDZ
14品种日期数量
P00012002-1-1010
P00012002-1-1011
P00012002-1-1050
P00012002-1-129
P00012002-1-128
P00012002-1-127
P00022002-10-105
P00022002-10-107
P00022002-10-120.5
P00032002-10-105
P00032002-10-127
P00032002-10-129
结果要先按照品种汇总,再按照日期汇总,结果如下:
P00012002-1-1071
P00012002-1-1224
P00022002-10-1012
P00022002-10-120.5
P00032002-10-105
P00032002-10-1216
SQLSERVER能做出这样的汇总吗…
15在分組查循中with{cube|rollup}的區別是什么?
如:
usepangu
selectfirm_id,p_id,sum(o_price_quantity)assum_values
fromorders
groupbyfirm_id,p_id
withcube
usepangu
selectfirm_id,p_id,sum(o_price_quantity)assum_values
fromorders
groupbyfirm_id,p_id
withrollup
的區別是什么?
CUBE和ROLLUP之间的区别在于:
CUBE生成的结果集显示了所选列中值的所有组合的聚合。
ROLLUP生成的结果集显示了所选列中值的某一层次结构的聚合。
例如,简单表Inventory中包含:
ItemColorQuantity
------------------------------------------------------------------
TableBlue124
TableRed223
ChairBlue101
ChairRed210
下列查询将生成小计报表:
SELECTCASEWHEN(GROUPING(Item)=1)THEN'ALL'
ELSEISNULL(Item,'UNKNOWN')
ENDASItem,
CASEWHEN(GROUPING(Color)=1)THEN'ALL'
ELSEISNULL(Color,'UNKNOWN')
ENDASColor,
SUM(Quantity)ASQtySum
FROMInventory
GROUPBYItem,ColorWITHROLLUP
ItemColorQtySum
------------------------------------------------------------------
ChairBlue101.00
ChairRed210.00
ChairALL311.00
TableBlue124.00
TableRed223.00
TableALL347.00
ALLALL658.00
(7row(s)affected)
如果查询中的ROLLUP关键字更改为CUBE,那么CUBE结果集与上述结果相同,只是在结果集的末尾还会返回下列两行:
ALLBlue225.00
ALLRed433.00
CUBE操作为Item和Color中值的可能组合生成行。例如,CUBE不仅报告与Item值Chair相组合的Color值的所有可能组合(Red、Blue和Red+Blue),而且报告与Color值Red相组合的Item值的所有可能组合(Chair、Table和Chair+Table)。对于GROUPBY子句中右边的列中的每个值,ROLLUP操作并不报告左边一列(或左边各列)中值的所有可能组合。例如,ROLLUP并不对每个Color值报告Item值的所有可能组合。ROLLUP操作的结果集具有类似于COMPUTEBY所返回结果集的功能;然而,
ROLLUP具有下列优点:ROLLUP返回单个结果集;COMPUTEBY返回多个结果集,而多个结果集会增加应用程序代码的复杂性。ROLLUP可以在服务器游标中使用;COMPUTEBY不可以。有时,查询优化器为ROLLUP生成的执行计划比为COMPUTEBY生成的更为高效。
16假如我有两个表表1(电话号码,是否存在)表2(电话号码,是否拨打)想查找表1中的电话号码是否在表2中存在,如果存在就更新表1中的是否存在字段为1。UPDATE表1SET是否存在=1WHEREEXISTS(SELECT*FROM表2WHERE表2.电话号码=表1.电话号码)
17用存储过程调用外部程序.不过要做成com控件用sp_OACreate存储过程)DECLARE@objectintDECLARE@hrintDECLARE@srcvarchar(255),@descvarchar(255)EXEC@hr=sp_OACreate'SQLDMO.SQLServer',@objectOUTIF@hr<>0BEGINEXECsp_OAGetErrorInfo@object,@srcOUT,@descOUTSELECThr=convert(varbinary(4),@hr),Source=@src,Description=@descRETURNEND
(六)
1、在MSSQLServer中,用来显示数据库信息的系统存储过程是()Asp_dbhelpBsp_dbCsp_helpDsp_helpdb
2、SQL语言中,删除一个表的命令是()ADELETEBDROPCCLEARDREMORE
3、关系数据库中,主键是(__)A、为标识表中唯一的实体B、创建唯一的索引,允许空值C、只允许以表中第一字段建立D、允许有多个主键的
4、在Transact-SQL语法中,SELECT语句的完整语法较复杂,但至少包括的部分(1___),使用关键字(2___)可以把重复行屏蔽,将多个查询结果返回一个结果集合的运算符是(3___),如果在SELECT语句中使用聚合函数时,一定在后面使用(4___)。⑴A、SELECT,INTOB、SELECT,FROMC、SELECT,GROUPD、仅SELECT⑵A、DISTINCTB、UNIONC、ALLC、TOP⑶A、JOINB、UNIONC、INTOC、LIKE⑷A、GROUPBYB、COMPUTEBYC、HAVINGD、COMPUTE
5、语句DBCCSHRINKDATABASE(Sample,25)中的25表示的意思是A、25MB、剩余占整个空间的25%C、已用空间占整个空间的25%D、以上都不对
6、你是一个保险公司的数据库开发人员,公司的保单信息存储在SQLServer2000数据库中,你使用以下脚本建立了一个名为Policy的表:CREATETABLEPolicy(PolicyNumberintNOTNULLDEFAULT(0),InsuredLastNamechar(30)NOTNULL,InsuredFirstNamechar(20)NOTNULL,InsuredBirthDatedatetimeNOTNULL,PolicyDatedatetimeNOTNULL,FaceAmountmoneyNOTNULL,CONSTRAINTPK_PolicyPRIMARYKEY(PolicyNumber))每次公司销售出一份保单,Policy表中就增加一条记录,并赋予其一个新的保单号,你将怎么做?
a.建立一个INSTEADOFINSERT触发器来产生一个新的保单号,并将这个保单号插入数据表中。b.建立一个INSTEADOFUPDATE触发器来产生一个新的保单号,并将这个保单号插入数据表中。c.建立一个AFTERUPDATE触发器来产生一个新的保单号,并将这个保单号插入数据表中。d.用AFTERUPDATE触发器替代DEFAULT约束条件产生一个新的保单号,并将这个保单号插入数据表中。
7、在SQL语言中,如果要建立一个工资表包含职工号,姓名,职称。工资等字段。若要保证工资字段的取值不低于800元,最合适的实现方法是:A。在创建工资表时为”工资“字段建立缺省B。在创建工资表时为”工资“字段建立检查约束C。在工资表建立一个触发器D。为工资表数据输入编写一个程序进行控制
8、Select语句中用来连接字符串的符号是______.A.“+”B.“&”C.“||”D.“|”
9、你是一个出版公司的数据库开发人员,对特定的书名的每天的销售情况建立了如下的存储过程:CREATEPROCEDUREget_sales_for_titletitlevarchar(80),@ytd_salesintOUTPUTASSELECT@ytd_sales=ytd_salesFROMtitlesWHEREtitle=@titleIF@@ROWCOUNT=0RETURN(-1)ELSERETURN(0)另外建立了一个脚本执行这个存储过程,如果执行成功,将返回对应于书名的每天的销售情况的报表,如果执行失败,将返回“NoSalesFound”,怎样建立这个脚本?
A.DECLARE@retvalintDECLARE@ytdintEXECget_sales_for_title‘NetEtiquette’,@ytdIF@retval<0PRINT‘Nosalesfound’ELSEPRINT‘Yeartodatesales:’+STR(@ytd)GO
B.DECLARE@retvalintDECLARE@ytdintEXECget_sales_for_title‘NetEtiquette’,@ytdOUTPUTIF@retval<0PRINT‘Nosalesfound’ELSEPRINT‘Yeartodatesales:’+STR(@ytd)GO
C.DECLARE@retvalintDECLARE@ytdintEXECget_sales_for_title‘NetEtiquette’,@retvalOUTPUTIF@retval<0PRINT‘Nosalesfound’ELSEPRINT‘Yeartodatesales:’+STR(@ytd)GO
D.DECLARE@retvalintDECLARE@ytdintEXEC@retval=get_sales_for_title‘NetEtiquette’,@ytdOUTPUTIF@retval<0PRINT‘Nosalesfound’ELSEPRINT‘Yeartodatesales:’+STR(@ytd)GO
10、Youareadatabasedeveloperforacontainermanufacturingcompany.Thecontainersproducedbyyourcompanyareanumberofdifferentsizesandshapes.ThetablesthatstorethecontainerinformationareshownintheSize,Container,andShapeTablesexhibit:SizeSizeIDSizeNameHeightContainerContainerIDShapeIDSizeIDShapeShapeIDShapeNameMeasurements
Asampleofthedatastoredinthetablesisshownbelow:SizeTableSizeIDSizeNameHeight1Small402Medium603Large804Jumbo100ShapeTableShapeIDShapeNameMeasurement1Triangle102Triangle203Triangle304Square205Square306Square407Circle158Circle259Circle35Periodically,thedimensionsofthecontainerschange.Frequently,thedatabaseusersrequirethevolumeofacontainer.Thevolumeofacontaineriscalculatedbasedoninformationintheshapeandsizetables.YouneedtohidethedetailsofthecalculationsothatthevolumecanbeeasilyaccessedinaSELECTquerywiththerestofthecontainerinformation.Whatshouldyoudo?A.Createauser-definedfunctionthatrequiresContainerIDasanargumentandreturnsthevolumeofthecontainer.B.CreateastoredprocedurethatrequiresContainerIDasanargumentandreturnsthevolumeofthecontainer.C.Addacolumnnamedvolumetothecontainertable.Createatriggerthatcalculatesandstoresvolumeinthiscolumnwhenanewcontainerisinsertedintothetable.D.Addacomputedcolumntothecontainertablethatcalculatesthevolumeofthecontainer.
填空题(1空1分共20分)1、如果设计的表不符合第二范式,可能会导致_______,________,_______。2、SQL是由_______语言,________语言,_______语言组成。3、SQLServer在两个安全级上验证用户,分别是______________,_____________________。4、自定义函数由___________函数,_______________函数,___________________函数组成。5、备份策略的三种类型是__________备份,_______________备份,___________________备份组成。6、启动一个显式事务的语句为__________,提交事务的语句为__________,回滚事务的语句为__________7、表的每一行在表中是惟一的实体属于__________完整性,使列的输入有效属于__________完整性,两个表的主关键字和外关键字的数据应该对应一致属于__________完整性。简答题(共20分)1、在帮助中[,...n]意思是什么?(4分)2、请简述一下第二范式(4分)3、现有1销售表,它们结构如下:(4分)idint(标识号)codnochar(7)(商品编码)codnamevarchar(30)(商品名称)specvarchar(20)(商品规格)pricenumeric(10,2)(价格)sellnumint(销售数量)deptnochar(3)(售出分店编码)selldatedatetime(销售时间)要求:写出查询销售时间段在2002-2-15日到2002-4-29之间,分店编码是01的所有记录。4、写一个存储过程,要求传入一个表名,返回该表的记录数(假设传入的表在数据库中都存在)(4分)5、请简述UPDATE触发器如何工作原理。(4分)简答题:(共40分)1、(5分)使用一条SQL语句找到重复的值及重复的次数:有一数据表ZD_ks,其中有字段BM,MC,。。。,请查询出在ZD_ks中BM有重复的值及重复的次数,没有的不要列出。如下表:BMDUPCOUNT00130022
2、描述(5分)表1student学生信息表IDint学生编号Namevarchar学生姓名Sexbit性别(男0女1)Classint班级编号
表2schedule课程信息表IDint课程编号Namevarchar课程名称
表3Grade成绩信息表IDint自动编号UIDint学生编号SIDint课程编号Numint考试成绩
(a)求各班的总人数(1分)(b)求1班女生和男生的平均成绩(2分)(c)各班"数据结构"(课程名称)不及格的人数(2分)
3、问题描述:(30分)本题用到下面三个关系表:CARD借书卡。CNO卡号,NAME姓名,CLASS班级BOOKS图书。BNO书号,BNAME书名,AUTHOR作者,PRICE单价,QUANTITY库存册数BORROW借书记录。CNO借书卡号,BNO书号,RDATE还书日期备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。要求实现如下15个处理:1.找出借书超过5本的读者,输出借书卡号及所借图书册数。(2分)2.查询借阅了"水浒"一书的读者,输出姓名及班级。(3分)3.查询过期未还图书,输出借阅者(卡号)、书号及还书日期。(3分)4.查询书名包括"网络"关键词的图书,输出书号、书名、作者。(2分)5.查询现有图书中价格最高的图书,输出书名及作者。(2分)6.查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出。(4分)7.将"C01"班同学所借图书的还期都延长一周。(2分)8.从BOOKS表中删除当前无人借阅的图书记录。(2分)9.在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是"数据库技术及应用",就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表)。(4分)10.建立一个视图,显示"力01"班学生的借书信息(只要求显示姓名和书名)。(3分)11.查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出。(3分)
(七)
1、问题描述:已知关系模式:S(SNO,SNAME)学生关系。SNO为学号,SNAME为姓名C(CNO,CNAME,CTEACHER)课程关系。CNO为课程号,CNAME为课程名,CTEACHER为任课教师SC(SNO,CNO,SCGRADE)选课关系。SCGRADE为成绩要求实现如下5个处理:1.找出没有选修过“李明”老师讲授课程的所有学生姓名2.列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩3.列出既学过“1”号课程,又学过“2”号课程的所有学生姓名4.列出“1”号课成绩比“2”号同学该门课成绩高的所有学生的学号5.列出“1”号课成绩比“2”号课成绩高的所有学生的学号及其“1”号课和“2”号课的成绩
2、问题描述:为管理岗位业务培训信息,建立3个表:S(S#,SN,SD,SA)S#,SN,SD,SA分别代表学号、学员姓名、所属单位、学员年龄C(C#,CN)C#,CN分别代表课程编号、课程名称SC(S#,C#,G)S#,C#,G分别代表学号、所选修的课程编号、学习成绩
要求实现如下5个处理:1.使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名2.使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位3.使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位4.使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位5.查询选修了课程的学员人数6.查询选修课程超过5门的学员学号和所属单位
(八)
Student(S#,Sname,Sage,Ssex)学生表Course(C#,Cname,T#)课程表SC(S#,C#,score)成绩表Teacher(T#,Tname)教师表问题:1、查询“001”课程比“002”课程成绩高的所有学生的学号;selecta.S#from(selects#,scorefromSCwhereC#='001')a,(selects#,scorefromSCwhereC#='002')bwherea.score>b.scoreanda.s#=b.s#;2、查询平均成绩大于60分的同学的学号和平均成绩;selectS#,avg(score)fromscgroupbyS#havingavg(score)>60;3、查询所有同学的学号、姓名、选课数、总成绩;selectStudent.S#,Student.Sname,count(SC.C#),sum(score)fromStudentleftOuterjoinSConStudent.S#=SC.S#groupbyStudent.S#,Sname4、查询姓“李”的老师的个数;selectcount(distinct(Tname))fromTeacherwhereTnamelike'李%';5、查询没学过“叶平”老师课的同学的学号、姓名;selectStudent.S#,Student.SnamefromStudentwhereS#notin(selectdistinct(SC.S#)fromSC,Course,TeacherwhereSC.C#=Course.C#andTeacher.T#=Course.T#andTeacher.Tname='叶平');6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;selectStudent.S#,Student.SnamefromStudent,SCwhereStudent.S#=SC.S#andSC.C#='001'andexists(Select*fromSCasSC_2whereSC_2.S#=SC.S#andSC_2.C#='002');7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;selectS#,SnamefromStudentwhereS#in(selectS#fromSC,Course,TeacherwhereSC.C#=Course.C#andTeacher.T#=Course.T#andTeacher.Tname='叶平'groupbyS#havingcount(SC.C#)=(selectcount(C#)fromCourse,TeacherwhereTeacher.T#=Course.T#andTname='叶平'));8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;SelectS#,Snamefrom(selectStudent.S#,Student.Sname,score,(selectscorefromSCSC_2whereSC_2.S#=Student.S#andSC_2.C#='002')score2fromStudent,SCwhereStudent.S#=SC.S#andC#='001')S_2wherescore2<score;9、查询所有课程成绩小于60分的同学的学号、姓名;selectS#,SnamefromStudentwhereS#notin(selectStudent.S#fromStudent,SCwhereS.S#=SC.S#andscore>60);10、查询没有学全所有课的同学的学号、姓名;selectStudent.S#,Student.SnamefromStudent,SCwhereStudent.S#=SC.S#groupbyStudent.S#,Student.Snamehavingcount(C#)<(selectcount(C#)fromCourse);11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;selectS#,SnamefromStudent,SCwhereStudent.S#=SC.S#andC#inselectC#fromSCwhereS#='1001';12、查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名;selectdistinctSC.S#,SnamefromStudent,SCwhereStudent.S#=SC.S#andC#in(selectC#fromSCwhereS#='001');13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;updateSCsetscore=(selectavg(SC_2.score)fromSCSC_2whereSC_2.C#=SC.C#)fromCourse,TeacherwhereCourse.C#=SC.C#andCourse.T#=Teacher.T#andTeacher.Tname='叶平');14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名;selectS#fromSCwhereC#in(selectC#fromSCwhereS#='1002')groupbyS#havingcount(*)=(selectcount(*)fromSCwhereS#='1002');15、删除学习“叶平”老师课的SC表记录;DelectSCfromcourse,TeacherwhereCourse.C#=SC.C#andCourse.T#=Teacher.T#andTname='叶平';16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、2、号课的平均成绩;InsertSCselectS#,'002',(Selectavg(score)fromSCwhereC#='002')fromStudentwhereS#notin(SelectS#fromSCwhereC#='002');17、按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示:学生ID,,数据库,企业管理,英语,有效课程数,有效平均分SELECTS#as学生ID,(SELECTscoreFROMSCWHERESC.S#=t.S#ANDC#='004')AS数据库,(SELECTscoreFROMSCWHERESC.S#=t.S#ANDC#='001')AS企业管理,(SELECTscoreFROMSCWHERESC.S#=t.S#ANDC#='006')AS英语,COUNT(*)AS有效课程数,AVG(t.score)AS平均成绩FROMSCAStGROUPBYS#ORDERBYavg(t.score)18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分SELECTL.C#As课程ID,L.scoreAS最高分,R.scoreAS最低分FROMSCL,SCASRWHEREL.C#=R.C#andL.score=(SELECTMAX(IL.score)FROMSCASIL,StudentASIMWHEREL.C#=IL.C#andIM.S#=IL.S#GROUPBYIL.C#)ANDR.Score=(SELECTMIN(IR.score)FROMSCASIRWHERER.C#=IR.C#GROUPBYIR.C#);19、按各科平均成绩从低到高和及格率的百分数从高到低顺序SELECTt.C#AS课程号,max(course.Cname)AS课程名,isnull(AVG(score),0)AS平均成绩,100*SUM(CASEWHENisnull(score,0)>=60THEN1ELSE0END)/COUNT(*)AS及格百分数FROMSCT,Coursewheret.C#=course.C#GROUPBYt.C#ORDERBY100*SUM(CASEWHENisnull(score,0)>=60THEN1ELSE0END)/COUNT(*)DESC20、查询如下课程平均成绩和及格率的百分数(用"1行"显示):企业管理(001),马克思(002),OO&UML(003),数据库(004)SELECTSUM(CASEWHENC#='001'THENscoreELSE0END)/SUM(CASEC#WHEN'001'THEN1ELSE0END)AS企业管理平均分,100*SUM(CASEWHENC#='001'ANDscore>=60THEN1ELSE0END)/SUM(CASEWHENC#='001'THEN1ELSE0END)AS企业管理及格百分数,SUM(CASEWHENC#='002'THENscoreELSE0END)/SUM(CASEC#WHEN'002'THEN1ELSE0END)AS马克思平均分,100*SUM(CASEWHENC#='002'ANDscore>=60THEN1ELSE0END)/SUM(CASEWHENC#='002'THEN1ELSE0END)AS马克思及格百分数,SUM(CASEWHENC#='003'THENscoreELSE0END)/SUM(CASEC#WHEN'003'THEN1ELSE0END)ASUML平均分,100*SUM(CASEWHENC#='003'ANDscore>=60THEN1ELSE0END)/SUM(CASEWHENC#='003'THEN1ELSE0END)ASUML及格百分数,SUM(CASEWHENC#='004'THENscoreELSE0END)/SUM(CASEC#WHEN'004'THEN1ELSE0END)AS数据库平均分,100*SUM(CASEWHENC#='004'ANDscore>=60THEN1ELSE0END)/SUM(CASEWHENC#='004'THEN1ELSE0END)AS数据库及格百分数FROMSC21、查询不同老师所教不同课程平均分从高到低显示SELECTmax(Z.T#)AS教师ID,MAX(Z.Tname)AS教师姓名,C.C#AS课程ID,MAX(C.Cname)AS课程名称,AVG(Score)AS平均成绩FROMSCAST,CourseASC,TeacherASZwhereT.C#=C.C#andC.T#=Z.T#GROUPBYC.C#ORDERBYAVG(Score)DESC22、查询如下课程成绩第3名到第6名的学生成绩单:企业管理(001),马克思(002),UML(003),数据库(004)[学生ID],[学生姓名],企业管理,马克思,UML,数据库,平均成绩SELECTDISTINCTtop3SC.S#As学生学号,Student.SnameAS学生姓名,T1.scoreAS企业管理,T2.scoreAS马克思,T3.scoreASUML,T4.scoreAS数据库,ISNULL(T1.score,0)+ISNULL(T2.score,0)+ISNULL(T3.score,0)+ISNULL(T4.score,0)as总分FROMStudent,SCLEFTJOINSCAST1ONSC.S#=T1.S#ANDT1.C#='001'LEFTJOINSCAST2ONSC.S#=T2.S#ANDT2.C#='002'LEFTJOINSCAST3ONSC.S#=T3.S#ANDT3.C#='003'LEFTJOINSCAST4ONSC.S#=T4.S#ANDT4.C#='004'WHEREstudent.S#=SC.S#andISNULL(T1.score,0)+ISNULL(T2.score,0)+ISNULL(T3.score,0)+ISNULL(T4.score,0)NOTIN(SELECTDISTINCTTOP15WITHTIESISNULL(T1.score,0)+ISNULL(T2.score,0)+ISNULL(T3.score,0)+ISNULL(T4.score,0)FROMscLEFTJOINscAST1ONsc.S#=T1.S#ANDT1.C#='k1'LEFTJOINscAST2ONsc.S#=T2.S#ANDT2.C#='k2'LEFTJOINscAST3ONsc.S#=T3.S#ANDT3.C#='k3'LEFTJOINscAST4ONsc.S#=T4.S#ANDT4.C#='k4'ORDERBYISNULL(T1.score,0)+ISNULL(T2.score,0)+ISNULL(T3.score,0)+ISNULL(T4.score,0)DESC);23、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[<60]SELECTSC.C#as课程ID,Cnameas课程名称,SUM(CASEWHENscoreBETWEEN85AND100THEN1ELSE0END)AS[100-85],SUM(CASEWHENscoreBETWEEN70AND85THEN1ELSE0END)AS[85-70],SUM(CASEWHENscoreBETWEEN60AND70THEN1ELSE0END)AS[70-60],SUM(CASEWHENscore<60THEN1ELSE0END)AS[60-]FROMSC,CoursewhereSC.C#=Course.C#GROUPBYSC.C#,Cname;24、查询学生平均成绩及其名次SELECT1+(SELECTCOUNT(distinct平均成绩)FROM(SELECTS#,AVG(score)AS平均成绩FROMSCGROUPBYS#)AST1WHERE平均成绩>T2.平均成绩)as名次,S#as学生学号,平均成绩FROM(SELECTS#,AVG(score)平均成绩FROMSCGROUPBYS#)AST2ORDERBY平均成绩desc;25、查询各科成绩前三名的记录:(不考虑成绩并列情况)SELECTt1.S#as学生ID,t1.C#as课程ID,Scoreas分数FROMSCt1WHEREscoreIN(SELECTTOP3scoreFROMSCWHEREt1.C#=C#ORDERBYscoreDESC)ORDERBYt1.C#;26、查询每门课程被选修的学生数selectc#,count(S#)fromscgroupbyC#;27、查询出只选修了一门课程的全部学生的学号和姓名selectSC.S#,Student.Sname,count(C#)AS选课数fromSC,StudentwhereSC.S#=Student.S#groupbySC.S#,Student.Snamehavingcount(C#)=1;28、查询男生、女生人数Selectcount(Ssex)as男生人数fromStudentgroupbySsexhavingSsex='男';Selectcount(Ssex)as女生人数fromStudentgroupbySsexhavingSsex='女';29、查询姓“张”的学生名单SELECTSnameFROMStudentWHERESnamelike'张%';30、查询同名同性学生名单,并统计同名人数selectSname,count(*)fromStudentgroupbySnamehavingcount(*)>1;;31、1981年出生的学生名单(注:Student表中Sage列的类型是datetime)selectSname,CONVERT(char(11),DATEPART(year,Sage))asagefromstudentwhereCONVERT(char(11),DATEPART(year,Sage))='1981';32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列SelectC#,Avg(score)fromSCgroupbyC#orderbyAvg(score),C#DESC;33、查询平均成绩大于85的所有学生的学号、姓名和平均成绩selectSname,SC.S#,avg(score)fromStudent,SCwhereStudent.S#=SC.S#groupbySC.S#,Snamehavingavg(score)>85;34、查询课程名称为“数据库”,且分数低于60的学生姓名和分数SelectSname,isnull(score,0)fromStudent,SC,CoursewhereSC.S#=Student.S#andSC.C#=Course.C#andCourse.Cname='数据库'andscore<60;35、查询所有学生的选课情况;SELECTSC.S#,SC.C#,Sname,CnameFROMSC,Student,CoursewhereSC.S#=Student.S#andSC.C#=Course.C#;36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;SELECTdistinctstudent.S#,student.Sname,SC.C#,SC.scoreFROMstudent,ScWHERESC.score>=70ANDSC.S#=student.S#;37、查询不及格的课程,并按课程号从大到小排列selectc#fromscwherescore<60orderbyC#;38、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名;selectSC.S#,Student.SnamefromSC,StudentwhereSC.S#=Student.S#andScore>80andC#='003';39、求选了课程的学生人数selectcount(*)fromsc;40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩selectStudent.Sname,scorefromStudent,SC,CourseC,TeacherwhereStudent.S#=SC.S#andSC.C#=C.C#andC.T#=Teacher.T#andTeacher.Tname='叶平'andSC.score=(selectmax(score)fromSCwhereC#=C.C#);41、查询各个课程及相应的选修人数selectcount(*)fromscgroupbyC#;42、查询不同课程成绩相同的学生的学号、课程号、学生成绩selectdistinctA.S#,B.scorefromSCA,SCBwhereA.Score=B.ScoreandA.C#<>B.C#;43、查询每门功成绩最好的前两名SELECTt1.S#as学生ID,t1.C#as课程ID,Scoreas分数FROMSCt1WHEREscoreIN(SELECTTOP2scoreFROMSCWHEREt1.C#=C#ORDERBYscoreDESC)ORDERBYt1.C#;44、统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人数相同,按课程号升序排列selectC#as课程号,count(*)as人数fromscgroupbyC#orderbycount(*)desc,c#45、检索至少选修两门课程的学生学号selectS#fromscgroupbys#havingcount(*)>=246、查询全部学生都选修的课程的课程号和课程名selectC#,CnamefromCoursewhereC#in(selectc#fromscgroupbyc#)47、查询没学过“叶平”老师讲授的任一门课程的学生姓名selectSnamefromStudentwhereS#notin(selectS#fromCourse,Teacher,SCwhereCourse.T#=Teacher.T#andSC.C#=course.C#andTname='叶平');48、查询两门以上不及格课程的同学的学号及其平均成绩selectS#,avg(isnull(score,0))fromSCwhereS#in(selectS#fromSCwherescore<60groupbyS#havingcount(*)>2)groupbyS#;49、检索“004”课程分数小于60,按分数降序排列的同学学号selectS#fromSCwhereC#='004'andscore<60orderbyscoredesc;50、删除“002”同学的“001”课程的成绩deletefromScwhereS#='001'andC#='001';问题描述:本题用到下面三个关系表:CARD借书卡。CNO卡号,NAME姓名,CLASS班级BOOKS图书。BNO书号,BNAME书名,AUTHOR作者,PRICE单价,QUANTITY库存册数BORROW借书记录。CNO借书卡号,BNO书号,RDATE还书日期备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。要求实现如下15个处理:1.写出建立BORROW表的SQL语句,要求定义主码完整性约束和引用完整性约束。2.找出借书超过5本的读者,输出借书卡号及所借图书册数。3.查询借阅了"水浒"一书的读者,输出姓名及班级。4.查询过期未还图书,输出借阅者(卡号)、书号及还书日期。5.查询书名包括"网络"关键词的图书,输出书号、书名、作者。6.查询现有图书中价格最高的图书,输出书名及作者。7.查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出。8.将"C01"班同学所借图书的还期都延长一周。9.从BOOKS表中删除当前无人借阅的图书记录。10.如果经常按书名查询图书信息,请建立合适的索引。11.在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是"数据库技术及应用",就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表)。12.建立一个视图,显示"力01"班学生的借书信息(只要求显示姓名和书名)。13.查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出。14.假定在建BOOKS表时没有定义主码,写出为BOOKS表追加定义主码的语句。15.对CARD表做如下修改:a.将NAME最大列宽增加到10个字符(假定原为6个字符)。b.为该表增加1列NAME(系名),可变长,最大20个字符。1.写出建立BORROW表的SQL语句,要求定义主码完整性约束和引用完整性约束--实现代码:CREATETABLEBORROW(CNOintFOREIGNKEYREFERENCESCARD(CNO),BNOintFOREIGNKEYREFERENCESBOOKS(BNO),RDATEdatetime,PRIMARYKEY(CNO,BNO))2.找出借书超过5本的读者,输出借书卡号及所借图书册数--实现代码:SELECTCNO,借图书册数=COUNT(*)FROMBORROWGROUPBYCNOHAVINGCOUNT(*)>53.查询借阅了"水浒"一书的读者,输出姓名及班级--实现代码:SELECT*FROMCARDcWHEREEXISTS(SELECT*FROMBORROWa,BOOKSbWHEREa.BNO=b.BNOANDb.BNAME=N'水浒'ANDa.CNO=c.CNO)4.查询过期未还图书,输出借阅者(卡号)、书号及还书日期--实现代码:SELECT*FROMBORROWWHERERDATE<GETDATE()5.查询书名包括"网络"关键词的图书,输出书号、书名、作者--实现代码:SELECTBNO,BNAME,AUTHORFROMBOOKSWHEREBNAMELIKEN'%网络%'6.查询现有图书中价格最高的图书,输出书名及作者--实现代码:SELECTBNO,BNAME,AUTHORFROMBOOKSWHEREPRICE=(SELECTMAX(PRICE)FROMBOOKS)7.查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出--实现代码:SELECTa.CNOFROMBORROWa,BOOKSbWHEREa.BNO=b.BNOANDb.BNAME=N'计算方法'ANDNOTEXISTS(SELECT*FROMBORROWaa,BOOKSbbWHEREaa.BNO=bb.BNOANDbb.BNAME=N'计算方法习题集'ANDaa.CNO=a.CNO)ORDERBYa.CNODESC8.将"C01"班同学所借图书的还期都延长一周--实现代码:UPDATEbSETRDATE=DATEADD(Day,7,b.RDATE)FROMCARDa,BORROWbWHEREa.CNO=b.CNOANDa.CLASS=N'C01'9.从BOOKS表中删除当前无人借阅的图书记录--实现代码:DELETEAFROMBOOKSaWHERENOTEXISTS(SELECT*FROMBORROWWHEREBNO=a.BNO)10.如果经常按书名查询图书信息,请建立合适的索引--实现代码:CREATECLUSTEREDINDEXIDX_BOOKS_BNAMEONBOOKS(BNAME)11.在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是"数据库技术及应用",就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表)--实现代码:CREATETRIGGERTR_SAVEONBORROWFORINSERT,UPDATEASIF@@ROWCOUNT>0INSERTBORROW_SAVESELECTi.*FROMINSERTEDi,BOOKSbWHEREi.BNO=b.BNOANDb.BNAME=N'数据库技术及应用'12.建立一个视图,显示"力01"班学生的借书信息(只要求显示姓名和书名)--实现代码:CREATEVIEWV_VIEWASSELECTa.NAME,b.BNAMEFROMBORROWab,CARDa,BOOKSbWHEREab.CNO=a.CNOANDab.BNO=b.BNOANDa.CLASS=N'力01'13.查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出--实现代码:SELECTa.CNOFROMBORROWa,BOOKSbWHEREa.BNO=b.BNOANDb.BNAMEIN(N'计算方法',N'组合数学')GROUPBYa.CNOHAVINGCOUNT(*)=2ORDERBYa.CNODESC14.假定在建BOOKS表时没有定义主码,写出为BOOKS表追加定义主码的语句--实现代码:ALTERTABLEBOOKSADDPRIMARYKEY(BNO)15.1将NAME最大列宽增加到10个字符(假定原为6个字符)--实现代码:ALTERTABLECARDALTERCOLUMNNAMEvarchar(10)15.2为该表增加1列NAME(系名),可变长,最大20个字符--实现代码:ALTERTABLECARDADD系名varchar(20)问题描述:为管理岗位业务培训信息,建立3个表:S(S#,SN,SD,SA)S#,SN,SD,SA分别代表学号、学员姓名、所属单位、学员年龄C(C#,CN)C#,CN分别代表课程编号、课程名称SC(S#,C#,G)S#,C#,G分别代表学号、所选修的课程编号、学习成绩要求实现如下5个处理:1.使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名2.使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位3.使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位4.使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位5.查询选修了课程的学员人数6.查询选修课程超过5门的学员学号和所属单位1.使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名--实现代码:SELECTSN,SDFROMSWHERE[S#]IN(SELECT[S#]FROMC,SCWHEREC.[C#]=SC.[C#]ANDCN=N'税收基础')2.使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位--实现代码:SELECTS.SN,S.SDFROMS,SCWHERES.[S#]=SC.[S#]ANDSC.[C#]='C2'3.使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位--实现代码:SELECTSN,SDFROMSWHERE[S#]NOTIN(SELECT[S#]FROMSCWHERE[C#]='C5')4.使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位--实现代码:SELECTSN,SDFROMSWHERE[S#]IN(SELECT[S#]FROMSCRIGHTJOINCONSC.[C#]=C.[C#]GROUPBY[S#]HAVINGCOUNT(*)=COUNT(DISTINCT[S#]))5.查询选修了课程的学员人数--实现代码:SELECT学员人数=COUNT(DISTINCT[S#])FROMSC6.查询选修课程超过5门的学员学号和所属单位--实现代码:SELECTSN,SDFROMSWHERE[S#]IN(SELECT[S#]FROMSCGROUPBY[S#]HAVINGCOUNT(DISTINCT[C#])>5)ifnotobject_id('cj')isnulldroptablecjgocreatetablecj(stuNamenvarchar(10),KCMnvarchar(10),cjnumeric(5,2))insertintocjselect'张三','语文',98unionselect'李四','语文',89unionselect'王五','语文',67unionselect'周攻','语文',56unionselect'张三','数学',89unionselect'李四','数学',78unionselect'王五','数学',90unionselect'周攻','数学',87方法一:selectstunamefrom(selectstuName,kcm,(selectcount(*)fromcjwherestuname!=a.stunameandkcm=a.kcmandcj>a.cj)cntfromcja)xgroupbystunamehavingmax(cnt)<=1go方法二:SELECTstunameFROMcj1awherecjIN(SELECTTOP2cjFROMcj1WHEREkcm=a.kcmORDERBYcjdesc)GROUPBYstunameHAVING(count(1)>1)方法三:selectdistinctstunamefromcjawherenotexists(selectkcmfromcjbwherea.stuname=stunameand(selectcount(*)fromcjwherekcm=b.kcmandstuname!=a.stunameandcj>b.cj)>1)
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: