实验6分类汇总
设计性实验
(1)查询每门课程的平均分,包括课程号和平均分。
SELECT Cno AS 课程号, AVG(Degree) AS 平均分
FROM Score065
GROUP BY Cno;
(2)查询每门课程的平均分,包括课程号、课程名和平均分。
SELECT c.Cno AS 课程号, c.Cname AS 课程名, AVG(sc.Degree) AS 平均分
FROM Score065 sc
JOIN Course065 c ON sc.Cno = c.Cno
GROUP BY c.Cno, c.Cname;
(3)查询男的平均分,包括学号和平均分。
SELECT s.Sno AS 学号, AVG(sc.Degree) AS 平均分
FROM Score065 sc
JOIN student065 s ON sc.Sno = s.Sno
WHERE s.Ssex = '男'
GROUP BY s.Sno;
(4)查询女的平均分,包括学号,姓名和平均分。
SELECT s.Sno AS 学号, s.Sname AS 姓名, AVG(sc.Degree) AS 平均分
FROM Score065 sc
JOIN student065 s ON sc.Sno = s.Sno
WHERE s.Ssex = '女'
GROUP BY s.Sno, s.Sname;
(5)查询每门课程的最高、最低分,包括课程号和最高、最低分。
SELECT Cno AS 课程号, MAX(Degree) AS 最高分, MIN(Degree) AS 最低分
FROM Score065
GROUP BY Cno;
(6)查询每位学生的最高、最低分、平均分,包括学号,姓名和最高、最低分、平均分。
SELECT s.Sno AS 学号, s.Sname AS 姓名, MAX(sc.Degree) AS 最高分, MIN(sc.Degree) AS 最低分, AVG(sc.Degree) AS 平均分
FROM Score065 sc
JOIN student065 s ON sc.Sno = s.Sno
GROUP BY s.Sno, s.Sname;
(7)查询所有成绩都及格的学号,姓名
SELECT s.Sno AS 学号, s.Sname AS 姓名
FROM student065 s
WHERE NOT EXISTS (SELECT 1FROM Score065 scWHERE sc.Sno = s.Sno AND sc.Degree < 60
);
(8)查询每位老师所授课程的最高、最低分,包括教师号,姓名,课程名和最高、最低分。
SELECT t.Tno AS 教师号, t.Tname AS 教师姓名, c.Cname AS 课程名, MAX(sc.Degree) AS 最高分, MIN(sc.Degree) AS 最低分
FROM Score065 sc
JOIN Course065 c ON sc.Cno = c.Cno
JOIN teacher065 t ON c.Tno = t.Tno
GROUP BY t.Tno, t.Tname, c.Cname;
(9)查询学生信息,包括学号,课程号,成绩以及学生的平均分。(一个语句)
SELECT sc.Sno AS 学号, sc.Cno AS 课程号, sc.Degree AS 成绩, AVG(sc.Degree) OVER (PARTITION BY sc.Sno) AS 学生平均分
FROM Score065 sc;
(10)查询学生信息,包括姓名,课程名,成绩以及每位学生的平均分和每门课程的平均分。(一个语句)
SELECT s.Sname AS 姓名, c.Cname AS 课程名, sc.Degree AS 成绩, AVG(sc.Degree) OVER (PARTITION BY sc.Sno) AS 学生平均分, AVG(sc.Degree) OVER (PARTITION BY sc.Cno) AS 课程平均分
FROM Score065 sc
JOIN student065 s ON sc.Sno = s.Sno
JOIN Course065 c ON sc.Cno = c.Cno;
(11)查询学生信息,包括学号,姓名,课程号,课程名,成绩以及每位学生的平均分和每门课程的平均分。(一个语句)
SELECT s.Sno AS 学号, s.Sname AS 姓名, sc.Cno AS 课程号, c.Cname AS 课程名, sc.Degree AS 成绩, AVG(sc.Degree) OVER (PARTITION BY sc.Sno) AS 学生平均分, AVG(sc.Degree) OVER (PARTITION BY sc.Cno) AS 课程平均分
FROM Score065 sc
JOIN student065 s ON sc.Sno = s.Sno
JOIN Course065 c ON sc.Cno = c.Cno;
(12)查询学生信息,包括学号,姓名,课程号,课程名以及每位学生的平均分和每门课程的平均分。(一个语句)
如:
SELECT s.Sno AS 学号, s.Sname AS 姓名, sc.Cno AS 课程号, c.Cname AS 课程名, AVG(sc.Degree) OVER (PARTITION BY sc.Sno) AS 学生平均分, AVG(sc.Degree) OVER (PARTITION BY sc.Cno) AS 课程平均分
FROM Score065 sc
JOIN student065 s ON sc.Sno = s.Sno
JOIN Course065 c ON sc.Cno = c.Cno;
实验小结(实验中遇到的问题及解决过程、实验中产生的错误及原因分析、实验体会和收获)
这次的实验整体上来说比之前更难了,当一次性查询的数据越来越多的时候,就很容易出现报错,尤其是当我直接把老师发的文档中的代码复制过来,最容易出现的一个问题就是中英文的(’’)这一点,所以有时候手敲代码反而更不容易报错,反而可以加深记忆。
然后就是,在处理聚集函数时,比如查询每门课程的平均分、最高分和最低分,我意识到直接使用MAX()、AVG()、MIN()这样的函数虽然简单,但如果想要结果更清晰易读,给这些计算出来的值命名是非常重要的(虽然我前面几次验证性实验的查询结果没有显示“最高分”,“最低分”,“平均分”这几点,但是通过询问AI,我在后续的设计性实验则显示出了“平均分”等表明)。
而在进行分组统计时,我遇到了一个特别头疼的问题——如何正确地使用GROUP BY语句。最初写的查询虽然能跑通,但一旦涉及到复杂的条件筛选(如HAVING子句),就显得很麻烦。例如,在查询选修了3门以上课程的学生学号时,一开始忘记加上COUNT(*) >= 3的条件,导致结果完全不对。经过多次调试和借助ai帮助,我才慢慢理解了如何结合GROUP BY和HAVING来实现复杂条件下的数据筛选。
多表连接查询我觉得是最难且震撼的吧。特别是当需要同时展示学生信息(包括姓名、学号)和他们的成绩时,我发现如果不合理使用表别名,查询语句会变得复杂。通过不断尝试和调整,学会了简洁地使用别名。这个过程中,我逐渐认识到良好的代码习惯是多么重要,它不仅能减少错误,还能让自己和其他人更容易理解(就像之前写编程代码时,老师总是强调说要可读性,但是以前总是没那么在意,这次真的是大有感悟了)。
总的来说,这次实验不仅仅是技术上的提升,更是一次心态上的成长(每一次实验都是一次挑战,每次看到题目就会有点害怕,但是一步步写下来,发现有些东西只有你去做了,才知道是什么样子的,也许过程会比较艰难,但是得到结果的那一刻确实是开心的)。面对各种问题和挑战,我不再急于求成,而是耐心地寻找解决方案,询问身边的同学或者是借助不同的人工智能,并从中总结经验教训。未来面对更复杂的数据库任务时,我相信自己能够更加从容应对,不再惧怕遇到的问题。当然,也希望自己有一天可以不借助任何工具独立地完成一个实验,那时候应该是最有成就感的了吧。