按照课程代码cno统计选修成绩表score中, 第2学期(semester=“2”),每门课程的平均分,并将结果按照平均分降序排列
时间: 2024-10-22 18:06:53 浏览: 20
要按照课程代码(cno)统计第2学期(semester="2")每门课程的成绩表(score)的平均分,并按平均分降序排列,你可以使用SQL查询来完成这个任务。假设表`score`有`cno`(课程代码)、`student_id`、`score`(分数)和`semester`(学期)字段,以下是查询示例:
```sql
SELECT cno, AVG(score) AS average_score
FROM score
WHERE semester = '2'
GROUP BY cno
ORDER BY average_score DESC;
```
这条SQL命令做了以下几件事:
1. `SELECT cno, AVG(score)` 选择了需要计算平均分的字段`cno`以及其平均值`AVG(score)`。
2. `FROM score WHERE semester = '2'` 限制了查询范围,只包括学期为2的记录。
3. `GROUP BY cno` 将结果按照课程代码分组,以便对每个课程分别计算平均分。
4. `ORDER BY average_score DESC` 结果按照平均分(average_score)降序排序。
相关问题
数据库StudentCourse 有表SC含Sno作学号,Cno作课程号,Grade作成绩。表Student含Sno作学号,Sname作姓名,Ssex作性别,Sbirthday作出生日期,Sdept作所在系,Memo作备注。表Course含Cno作先行课课程号,Cname作姓名,PreCourse作先行课,PreCno作选修课程号,Credit作学分,Semester作开课学期。查找计算机系的学生选修课程数大于2的学生的姓名、平均成绩和选课门数,并按平均成绩降序排列
可以使用以下 SQL 语句来实现:
```sql
SELECT S.Sname, AVG(SC.Grade) AS AvgGrade, COUNT(*) AS CourseCount
FROM Student AS S
JOIN SC ON S.Sno = SC.Sno
JOIN Course AS C ON SC.Cno = C.Cno
WHERE S.Sdept = '计算机系'
GROUP BY S.Sno, S.Sname
HAVING COUNT(*) > 2
ORDER BY AvgGrade DESC;
```
解释一下 SQL 语句:
- 首先从 `Student` 表、`SC` 表和 `Course` 表中联结出需要的数据;
- 然后筛选出 `Sdept` 为计算机系的学生;
- 使用 `GROUP BY` 将结果按学生分组,同时计算出每个学生的平均成绩和选课门数;
- 使用 `HAVING` 过滤出选修课程数大于 2 的学生;
- 最后按平均成绩降序排列。
数据库StudentCourse 有表SC含Sno作学号,Cno作课程号,Grade作成绩。表Student含Sno作学号,Sname作姓名,Ssex作性别,Sbirthday作出生日期,Sdept作所在系,Memo作备注。表Course含Cno作课程号,Cname作姓名,PreCourse作先行课,PreCno作选修课程号,Credit作学分,Semester作开课学期。①查询选修了【数据库原理】的计算机系的学生学号和姓名。②查询每一门课的间接先行课(印先行课的先行课)。③查询学生的学号、姓名,选修课程的名称和成绩。④查询选修了课程的学生姓名。⑤查询所有学生的信息和所选修的课程的课程号。⑥查询已被选修的课程的情况和所有课程的名字。⑦列出学生所有可能的选修情况。⑧查找计算机系的学生选修课程数大于2的学生的姓名、平均成绩和选课门数,并按平均成绩降序排列:
①查询选修了【数据库原理】的计算机系的学生学号和姓名。
```sql
SELECT Student.Sno, Student.Sname
FROM Student, SC, Course
WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno AND Course.Cname = '数据库原理' AND Student.Sdept = '计算机系';
```
②查询每一门课的间接先行课(印先行课的先行课)。
```sql
WITH RECURSIVE pre_course(cno, pre_cno) AS (
SELECT Cno, PreCno FROM Course WHERE PreCno IS NOT NULL
UNION ALL
SELECT pre_course.cno, Course.PreCno FROM pre_course JOIN Course ON pre_course.pre_cno = Course.Cno
)
SELECT cno, group_concat(DISTINCT pre_cno) as indirect_pre_courses
FROM pre_course
GROUP BY cno;
```
③查询学生的学号、姓名,选修课程的名称和成绩。
```sql
SELECT Student.Sno, Student.Sname, Course.Cname, SC.Grade
FROM Student, SC, Course
WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno;
```
④查询选修了课程的学生姓名。
```sql
SELECT DISTINCT Student.Sname
FROM Student, SC, Course
WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno AND Course.Cname = '数据库原理';
```
⑤查询所有学生的信息和所选修的课程的课程号。
```sql
SELECT Student.*, SC.Cno
FROM Student LEFT JOIN SC ON Student.Sno = SC.Sno;
```
⑥查询已被选修的课程的情况和所有课程的名字。
```sql
SELECT Course.*, SC.Sno, SC.Grade
FROM Course LEFT JOIN SC ON Course.Cno = SC.Cno;
```
⑦列出学生所有可能的选修情况。
```sql
SELECT Student.Sno, Student.Sname, Course.Cno, Course.Cname
FROM Student CROSS JOIN Course;
```
⑧查找计算机系的学生选修课程数大于2的学生的姓名、平均成绩和选课门数,并按平均成绩降序排列。
```sql
SELECT Student.Sname, AVG(SC.Grade) AS avg_grade, COUNT(*) as course_count
FROM Student JOIN SC ON Student.Sno = SC.Sno JOIN Course ON SC.Cno = Course.Cno
WHERE Student.Sdept = '计算机系'
GROUP BY Student.Sno
HAVING COUNT(*) > 2
ORDER BY AVG(SC.Grade) DESC;
```
阅读全文