数据库实验报告(六)

实验报告(六)

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
);

数据库实验报告(六)_第1张图片

你可能感兴趣的:(数据库原理,sql,数据库)