统计所有课程均及格学生的平均成绩,及格的门数,结果按平均成绩降序,及格门数降序排列。
时间: 2023-11-11 07:02:08 浏览: 179
假设有以下两个表:
* `students` 表,包含学生姓名和学号信息
* `grades` 表,包含学生课程成绩信息,每行记录包括学号、课程号、分数等三个字段
则可以使用以下 SQL 语句进行查询:
```
SELECT AVG(g.score) AS avg_score, COUNT(DISTINCT g.course_id) AS num_passed_courses, s.name, s.student_id
FROM students s
JOIN grades g ON s.student_id = g.student_id
WHERE g.score >= 60
GROUP BY s.name, s.student_id
HAVING COUNT(DISTINCT g.course_id) = (SELECT COUNT(*) FROM courses)
ORDER BY avg_score DESC, num_passed_courses DESC
```
其中,`courses` 表为所有课程信息表,`COUNT(DISTINCT g.course_id)` 表示该学生及格的门数,`HAVING COUNT(DISTINCT g.course_id) = (SELECT COUNT(*) FROM courses)` 表示只统计及格门数等于总门数的学生。最后按照平均成绩降序、及格门数降序排列结果。
相关问题
5.查询所有学生除了选修1号课程外所有成绩均及格的学生的学号和平均成绩,其结果按平均成绩的降序排列。
可以使用如下 SQL 语句来查询:
```
SELECT SC.Sno, AVG(SC.Grade) AS avg_grade
FROM SC
WHERE SC.Sno NOT IN (
SELECT SC1.Sno
FROM SC AS SC1
WHERE SC1.Cno = 1 AND SC1.Grade < 60
)
GROUP BY SC.Sno
HAVING MIN(SC.Grade) >= 60
ORDER BY avg_grade DESC;
```
解释如下:
首先在子查询中找到选修了 1 号课程且成绩不及格的学生,使用 `NOT IN` 来排除这些学生。
之后在外层查询中,使用 `GROUP BY` 对学生进行分组,计算每个学生的平均成绩。
最后使用 `HAVING` 过滤掉不符合条件的学生(即所有成绩均及格的学生),并按平均成绩的降序排列。
查询选修2门以上课程的学生学号及平均成绩(指各课程的期末成绩的平均成绩,只统计及格的课程),并按其平均成绩降序排列输出
查询选修2门以上课程,并且所有课程都达到及格标准的学生学号及其平均成绩,可以按照以下步骤进行:
1. 首先,你需要有一个包含学生信息、课程信息以及成绩的数据表。这个表应该包括学生的ID,所选修的课程,每门课程的成绩等字段。
2. 使用SQL查询语句,假设表名为`student_courses_grades`,并且有字段`student_id`, `course_name`, 和 `grade`(等级字段区分是否及格,比如0表示不及格,大于0表示及格):
```sql
SELECT student_id, AVG(CASE WHEN grade > 0 THEN grade ELSE NULL END) AS average_grade
FROM student_courses_grades
GROUP BY student_id
HAVING COUNT(DISTINCT course_name) >= 2
ORDER BY average_grade DESC;
```
在这个查询中:
- `AVG()`函数计算每个学生的非零成绩的平均值,`CASE`语句用于过滤出及格的课程成绩。
- `GROUP BY`将结果按学生ID分组。
- `HAVING COUNT(DISTINCT course_name) >= 2`条件筛选出选修了2门及以上课程的学生。
- `ORDER BY average_grade DESC`按照平均成绩从高到低排序输出结果。
阅读全文