实验报告(六)
1、实验目的
(1) 掌握关联查询的用法
(2) 掌握集合查询的区别和用法
(3) 掌握EXISTS的用法
2、实验预习与准备
(1) 了解ANY,ALL的用法
(2) 了解Max,Min,In与ANY,ALL的等价规则
(3) 了解子查询的使用限制
(4) 了解非关联子查询的特点
(5) 了解关联子查询的特点
3、实验内容及步骤
(1) 查询入学成绩比本班平均入学成绩高的学生学号,姓名,班级和入学成绩(使用关联子查询)
select s.sno,s.sname,s.clno,sc.score
from student s,score sc
where sc.score > (select avg(score) from score) and s.sno=sc.sno;
(2) 查询没有选修“010002”号课程的学生姓名(使用Exists)
SELECT DISTINCT s.sno, s.sname
FROM student s
WHERE NOT EXISTS (
SELECT *
FROM score sc
WHERE sc.sno = s.sno AND sc.cno = '010002'
);
(3) 查询至少选修了姓名为“耿明”的学生所选修课程中一门课的学生的学号和姓名(使用Exists)
SELECT DISTINCT s.sno, s.sname
FROM student s
WHERE EXISTS (
SELECT *
FROM score sc
WHERE sc.sno = s.sno
AND EXISTS (
SELECT *
FROM score sc2
WHERE sc2.sno = '耿明'
AND sc2.cno = sc.cno
)
);
(4) 查询教授过张丹丹老师教授过的所有班级的教师姓名(使用Exists)
SELECT DISTINCT t.tname
FROM teacher t
WHERE EXISTS (
SELECT *
FROM class cl
WHERE EXISTS (
SELECT *
FROM course_class cc
WHERE cc.tno = t.tno
AND cc.clno = cl.clno
)
AND EXISTS (
SELECT *
FROM course_class cc2
WHERE cc2.tno = '张丹丹'
AND cc2.clno = cl.clno
)
);
(5) 查询入学成绩最高的和最低的学生的学号、姓名和入学成绩(集合查询)
select sno,sname,point from student where point=(select MAX(point) from student) or point=(select MIN(point) from student);
(6)查询期末平均成绩在85分以上的学生学号、姓名和出生日期
SELECT s.sno, s.sname, s.birth
FROM student s
JOIN score sc ON s.sno = sc.sno
GROUP BY s.sno, s.sname, s.birth
HAVING AVG(sc.score) > 85;
(7)查询每门课程最高分的学生的学号
SELECT cno, MAX(score) AS max_score
FROM score
GROUP BY cno;
(8)查询既选修了“大学英语”又选修了“金融学”的学生学号(至少写出使用连接查询、嵌套查询两种方法。思考:如果还要查询学生姓名呢?)
SELECT s.sno
FROM student s
JOIN score sc1 ON s.sno = sc1.sno
JOIN score sc2 ON s.sno = sc2.sno
JOIN course c1 ON sc1.cno = c1.cno
JOIN course c2 ON sc2.cno = c2.cno
WHERE c1.cname = '大学英语' AND c2.cname = '金融学';
(9)查询没有任何学生选修的课程编号和课程名称及学分(写出使用外连接, in+非关联子查询和exists+关联子查询三种方法)
-- Using LEFT JOIN
SELECT c.cno, c.cname, c.credit
FROM course c
LEFT JOIN score sc ON c.cno = sc.cno
WHERE sc.sno IS NULL;
-- Using IN with a subquery
SELECT cno, cname, credit
FROM course
WHERE cno NOT IN (
SELECT cno
FROM score
);
-- Using EXISTS with a subquery
SELECT c.cno, c.cname, c.credit
FROM course c
WHERE NOT EXISTS (
SELECT *
FROM score sc
WHERE sc.cno = c.cno
);