找出每个学生超过他所有的选修课程的平均成绩的课程,显示sno、sn、cn、score。按sno和cn升序排列 按照此要求修改
时间: 2024-11-15 18:31:30 浏览: 15
为了找出每个学生超过他们所有选修课程平均成绩的课程,你可以调整SQL查询以包括子查询来获取每个学生的平均成绩,并通过WHERE子句筛选那些成绩高于平均值的记录。假设你有一个名为`sc`的表,它存储了学生选课信息,结构如下:
```sql
CREATE TABLE sc (
sno INT,
cn INT,
score INT,
PRIMARY KEY (sno, cn)
);
```
你需要使用如下的SQL查询,其中`avg_scores`是一个子查询用于计算每个学生的平均成绩:
```sql
SELECT
s.sno AS sno,
c.cn AS cn,
c.score AS score
FROM
sc AS c
JOIN
(
SELECT
sno,
AVG(score) OVER(PARTITION BY sno) AS avg_score
FROM
sc
) AS s ON c.sno = s.sno
WHERE
c.score > s.avg_score
ORDER BY
sno ASC,
cn ASC;
```
这个查询首先对每个学生(`sno`)计算平均成绩,然后只选择那些单个课程的成绩大于该平均成绩的学生课程。
相关问题
在s表中有sno和sn,在sc表中有sno,cno和score,现查询每位学生的学号、姓名和选课成绩的平均成绩,成绩为null不计算在平均成绩之内,按从高到低降序排列
这个问题描述的是一个SQL查询需求,涉及到两个表:s表(包含学生信息,如`sno`和`sn`)和sc表(包含学生选课信息,如`sno`(学号)、`cno`(课程编号)和`score`(成绩))。你需要获取每个学生的`sno`、`sn`以及他们所有课程的平均成绩(忽略NULL值),并且结果按照平均成绩从高到低排序。
可以使用以下SQL查询来完成这个任务:
```sql
SELECT s.sno, s.sn, AVG(sc.score) as average_score
FROM s
LEFT JOIN sc ON s.sno = sc.sno
WHERE sc.score IS NOT NULL
GROUP BY s.sno, s.sn
ORDER BY average_score DESC;
```
这里做了以下操作:
1. `JOIN`:将s表和sc表通过`sno`字段连接在一起。
2. `LEFT JOIN`:确保不会漏掉s表中的任何一个学生,即使他们在sc表中没有对应记录。
3. `WHERE`:过滤出`score`不为NULL的结果。
4. `AVG(sc.score)`:计算每个学生选修课程的平均成绩。
5. `GROUP BY`:按`sno`和`s.sn`分组,以便为每个学生计算平均成绩。
6. `ORDER BY`:结果按照平均成绩从高到低排序。
阅读全文