失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > SQL server数据库实验(三)数据库的嵌套查询和集合查询

SQL server数据库实验(三)数据库的嵌套查询和集合查询

时间:2022-01-24 20:50:05

相关推荐

SQL server数据库实验(三)数据库的嵌套查询和集合查询

文章目录

一、针对教学管理数据库SCT,进行以下各种嵌套查询与集合查询1.查询选修了“数据库”课程的学生信息2.查询与学生“李维”在同一个院系的学生选课信息(包括李维)3.对每个选修了课程的学生,查询他获得最高成绩的课程号和成绩4.查询与“王丽”职称相同的其他女教师信息5.查询教师“周小平”和“王建宁”的授课信息,结果按照教师号升序显示6.查询至少选修了学生“李维”所选的所有课程的其他学生信息7.查询至少选修了“数据库”和“C语言”课程的学生信息8.查询“计算机”学院与“电子”学院的女学生信息9.查询选修了“C语言”但是未选修“数据库”课程的学生信息10.查询学分是3或4的课程信息11.查询无人选修的课程的详细信息二、针对教学管理数据库SCT,进行以下各种查询:1.查询选修了“CS-001”课程,且成绩为第3到第5名的学生姓名,要求按照成绩的降序输出2.查询各门课程选修学生数占学生总数的百分比;(没有学生选修的课程也要考虑)3.查询选课门数唯一的学生姓名(选课门数与其他学生都不相同)。(只考虑选修了课程的学生)

一、针对教学管理数据库SCT,进行以下各种嵌套查询与集合查询

1.查询选修了“数据库”课程的学生信息

select *from STUDENT055where SNO in(select SNOfrom SCT055where CNO in(select CNOfrom COURSE055where CNAME = '数据库'));

2.查询与学生“李维”在同一个院系的学生选课信息(包括李维)

select *from SCT055where SNO in(select SNOfrom STUDENT055where SDEPT in(select SDEPTfrom STUDENT055where SNAME = '李维'));

3.对每个选修了课程的学生,查询他获得最高成绩的课程号和成绩

select SNO,CNO,GRADEfrom SCT055where GRADE in(select MAX(GRADE)from SCT055group by SNO)

4.查询与“王丽”职称相同的其他女教师信息

select *from TEACHER055where TITLE in(select TITLEfrom TEACHER055where TNAME = '王丽') and TSEX = '女';

5.查询教师“周小平”和“王建宁”的授课信息,结果按照教师号升序显示

select distinct TNO,CNOfrom SCT055where TNO in(select TNOfrom TEACHER055where TNAME = '周小平' or TNAME = '王建宁')order by TNO;

6.查询至少选修了学生“李维”所选的所有课程的其他学生信息

SQL语句中没有蕴涵逻辑运算,但是可以利用谓词演算等价转换,它所表达的语义为:不存在这样的课程y,学生李维选修了y,而学生x没有选。

select *from STUDENT055where SNO in(select distinct SNOfrom SCT055 STU1where not exists(select *from SCT055 STU2where STU2.SNO in(select SNO from STUDENT055where SNAME = '李维')andnot exists(select *from SCT055 STU3where STU3.SNO = STU1.SNO O = O)));

7.查询至少选修了“数据库”和“C语言”课程的学生信息

intersect取交集

select *from STUDENT055where SNO in(select SNO from SCT055where CNO in(select CNOfrom COURSE055where CNAME = '数据库'))intersectselect *from STUDENT055where SNO in(select SNO from SCT055where CNO in(select CNOfrom COURSE055where CNAME = 'C语言'))

8.查询“计算机”学院与“电子”学院的女学生信息

union求并集

select *from STUDENT055where SSEX = '女' and SDEPT = '计算机'unionselect *from STUDENT055where SSEX = '女' and SDEPT = '电子'

9.查询选修了“C语言”但是未选修“数据库”课程的学生信息

差集

select *from STUDENT055where SNO in(select SNO from SCT055where CNO in(select CNOfrom COURSE055where CNAME = 'C语言'))exceptselect *from STUDENT055where SNO in(select SNO from SCT055where CNO in(select CNOfrom COURSE055where CNAME = '数据库'))

10.查询学分是3或4的课程信息

select *from COURSE055where CREDIT = '3'unionselect *from COURSE055where CREDIT = '4'

11.查询无人选修的课程的详细信息

select *from COURSE055where CNO in(select CNOfrom COURSE055)exceptselect *from COURSE055where CNO in(select distinct CNOfrom SCT055)

二、针对教学管理数据库SCT,进行以下各种查询:

(以下题目不限制查询方法)

1.查询选修了“CS-001”课程,且成绩为第3到第5名的学生姓名,要求按照成绩的降序输出

按照逻辑应该是top5减去top2,但是这样在SQL server里得不到正确答案,必须用top5减去top3才能得到第3到第5名。

没有排序order by时 返回记录默认从高到低,由于GRADE的index是降序,所以order by GRADE直接得到降序输出

select top 5 SNAME,GRADEfrom STUDENT055,SCT055where CNO = 'CS-001' andSCT055.SNO = STUDENT055.SNOexceptselect top 3 SNAME,GRADEfrom STUDENT055,SCT055where CNO = 'CS-001' andSCT055.SNO = STUDENT055.SNOorder by GRADE

2.查询各门课程选修学生数占学生总数的百分比;(没有学生选修的课程也要考虑)

convert转换成浮点数相除,concat函数加上百分号,没有学生选修的课程也要考虑所以使用左外连接。

select CNAME,concat(convert(float,count(SCT055.SNO))/(select count(*)from STUDENT055)*100,'%') as '选课人数占比'from COURSE055 left join SCT055on O = Ogroup by AMEorder by count (*) desc

3.查询选课门数唯一的学生姓名(选课门数与其他学生都不相同)。(只考虑选修了课程的学生)

select SNAMEfrom STUDENT055where SNO in(select X.SNOfrom STUDENT055 X,SCT055where X.SNO = SCT055.SNOgroup by X.SNOhaving count(CNO) not in(select count(CNO)from STUDENT055 Y,SCT055where Y.SNO = SCT055.SNO and Y.SNO !=X.SNOgroup by Y.SNO))

如果觉得《SQL server数据库实验(三)数据库的嵌套查询和集合查询》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。