目录
检索查询
题目一
题目二
题目三
题目四
题目五
题目六
题目七
题目八
题目九(本篇最难的题目)
分析
实现(两种方式)
模板
总结
检索查询
按照要求查找数据库中的数据
题目一
找出没有选修任何课程的学生的学号、姓名(即没有选课记录的学生)
select sid,name
from pub.student
where sid in ((select sid from pub.student)minus(select distinct sidfrom pub.student_course)
)
关键点:
1、没有选修任何课的学生=所有学生-选了课的学生
所有学生:select sid from pub.student
选了课的学生:select distinct sid from pub.student_course
2、减号就是minus关键字
题目二
找出至少选修了学号为“200900130417”的学生所选修的一门课的学生的学号、姓名(不包含这名同学)。
select sid,name
from pub.student
where sid in((select distinct sidfrom pub.student_coursewhere cid in (select cidfrom pub.student_coursewhere sid='200900130417'))minus(select sidfrom pub.studentwhere sid='200900130417')
)
关键点:
找“200900130417”学号的学生选修的全部课程——》找pub.student_course中cid在全部课程中的选课记录——》拿出sid在pub.student中进一步获取name
题目三
找出至少选修了一门其先行课程号为“300002”号课程的学生的学号、姓名。
select sid, namefrom pub.studentwhere sid in(select sidfrom pub.student_coursewhere cid in ( select cidfrom pub.student_coursewhere pcid='300002')
)
关键点:
1、找先行课程号为“300002”号的课程——》找pub.student_course中cid在前面课程中的选课记录——》拿出sid在pub.student中进一步获取name
2、题目二和题目三的思路是相似的
题目四
找出选修了“操作系统”并且也选修了“数据结构”,但是没有选修“程序设计语言”的学生的学号、姓名。
select sid,namefrom pub.studentwhere sid in((select sidfrom pub.student_coursewhere cid=(select cidfrom pub.coursewhere name='操作系统'))intersect(select sidfrom pub.student_coursewhere cid=(select cidfrom pub.coursewhere name='数据结构'))minus(select sidfrom pub.student_coursewhere cid=(select cidfrom pub.coursewhere name='程序设计语言')))
关键点:
1、干了A,并且干了B,但没有干C=A的结果 交 B的结果 减 C的结果
2、intersect关键字:取交集
题目五
找出姓名叫“李龙”的学生的学号及其选修全部课程的课程号、课程名和成绩。
create view test3 as
select sid,cid,pub.course_name,score
from pub.student natural join pub.student_course natural join pub.course
where pub.student_name='李龙'
create view test2_05 asselect sid,cid,name,scorefrom pub.student_course natural join pub.coursewhere sid in(select sidfrom pub.studentwhere name='李龙')
关键点
1、 第一个代码是错误的。因为pub.student和pub.course中都有name属性,而这两者自然连接显然是不合理的
2、将三个自然连接拆为:两个自然连接+一个嵌套select语句
题目六
查询2010级、计算机科学与技术学院、操作系统的学生成绩表,内容有学号、姓名、成绩。
select sid,name,scorefrom pub.student_course natural join pub.studentwhere class='2010' and dname='计算机科学与技术学院' and cid=(select cidfrom pub.coursewhere name='操作系统')
关键点:
1、同样考察自然连接的应用
题目七
查询所有不姓张、不姓李、也不姓王的学生的学号sid、姓名name
select sid,name
from pub.student
where name not like '张%'
and name not like '李%'
and name not like '王%'
关键点:
1、 不姓A=not like ‘A%'
2、 名字不叫B=not like ‘%B’
题目八
找出有间接先行课的所有课程的课程号、课程名称。
select cid ,name
from pub.course
where fcid in (select cidfrom pub.coursewhere fcid is not NULL
)
关键点:
1、 不为空=is not NULL
2、间接关系的处理(例:祖孙关系)
题目九(本篇最难的题目)
找出选修了所有课程的学生的学号、姓名。
分析
第一想法:拿出所有课程——》令pub.student_course(选用sid,cid)除取所有课程(cid)——》得到sid,这个sid'所选用的课程就是全部课程
问题是:SQL语言不提供直接可以用的除运算
实现(两种方式)
方法一、
select sid,name
from pub.student
where not exists(select cidfrom pub.coursewhere not exists(select * from pub.student_coursewhere pub.student_course.cid=pub.course.cid and pub.student_course.sid=pub.student.sid)
)
方法二、
select sid,name
from pub.student
where not exists((select cidfrom pub.course)minus(select cidfrom pub.student_coursewhere pub.student_course.sid=pub.student.sid)
)
模板
查询做了所有(至少)A的B
SELECT * FROM S
WHERE NOT EXISTS(SELECT * FROM C WHERE C.`cno` IN ('C001','C002')AND NOT EXISTS(SELECT * FROM SCWHERE SC.`cno` = C.`cno` AND SC.`sno` = S.`sno` )
)
总结
本文的所有题目均来自《数据库系统概念》(黑宝书)、山东大学数据库实验二。不可用于商业用途转发。
如果能帮助到大家,大家可以点点赞、收收藏呀~