C 课程信息表(课号Cno, 课程名称Cname, 授课教师Teacher)、 SC 选课表(学号Sno, 课号Cno, 成绩Grade)查询每门课程的课号、课名、选课人数及平均成绩;要求查询结果按平均成绩的降序排列
时间: 2024-11-16 22:20:49 浏览: 28
在SQL查询中,你可以通过联接两个表(Course 和 SC),并使用 COUNT 函数计算选课人数,以及 AVG 函数计算平均成绩来实现这个需求。下面是一个示例 SQL 查询:
```sql
SELECT
Course.Cno AS 课号,
Course.Cname AS 课程名称,
COUNT(*) OVER (PARTITION BY Course.Cno) AS 选课人数,
AVG(Sc.Grade) OVER (PARTITION BY Course.Cno) AS 平均成绩
FROM
Course
LEFT JOIN
SC ON Course.Cno = SC.Cno
ORDER BY
AVG(Sc.Grade) DESC;
```
解释一下这个查询:
- `JOIN` 操作将 Course 表和 SC 表通过课号 (`Cno`) 进行关联。
- `COUNT(*) OVER (PARTITION BY Course.Cno)` 计算每个课程的选课人数,对每个课号(Cno)进行分区。
- `AVG(Sc.Grade) OVER (PARTITION BY Course.Cno)` 计算每个课程的平均成绩。
- `GROUP BY` 被省略,因为我们在 SELECT 中直接使用了聚合函数,不需要单独列出。
- `ORDER BY AVG(Sc.Grade) DESC` 将结果按照平均成绩降序排序。
相关问题
在sc表中创建存储过程p2根据学号SNO查询相应学号的学生的所有个人成绩,在sc表中有学号SNO,课程号CNO以及成绩GRADE三个字段
好的,我了解了你的要求,下面是针对你的问题的SQL语句:
CREATE PROCEDURE p2 (@sno varchar(10))
AS
SELECT S.SNO, S.SNAME, C.CNO, C.CNAME, SC.GRADE
FROM SC SC
INNER JOIN S S ON S.SNO = SC.SNO
INNER JOIN C C ON C.CNO = SC.CNO
WHERE SC.SNO = @sno;
这个存储过程会返回给你表 SC 中学号为 @sno 的学生的所有个人成绩,包括学生姓名、课程名称等信息。希望这能够帮助到你!
建立视图v_sc_avg,通过视图可以查看课程号cno,课程名cname,课程平均成绩avggrade。 基本表course: course.png 基本表sc: sc.png
好的,你的问题是建立一个视图v_sc_avg,该视图可以查看课程号cno,课程名cname,课程平均成绩avggrade。基本表course如下所示:
```
course(cno, cname)
```
基本表sc如下所示:
```
sc(sno, cno, grade)
```
可以使用以下SQL语句创建视图v_sc_avg:
```
CREATE VIEW v_sc_avg AS
SELECT c.cno, c.cname, AVG(s.grade) AS avggrade
FROM course c INNER JOIN sc s ON c.cno = s.cno
GROUP BY c.cno, c.cname;
```
这将创建一个名为v_sc_avg的视图,其中包含课程号、课程名和平均成绩。你可以使用以下SQL查询视图:
```
SELECT * FROM v_sc_avg;
```
希望这可以帮助你。
阅读全文