好的,假设您有两个表:学生表(student)和课程表(course),其中学生表包含学生的信息,课程表包含课程的信息,两个表之间通过学生 ID 和课程 ID 进行关联。在学生表中,学生 ID 是主键;在课程表中,课程 ID 是主键。
学生表(student)结构:
字段名 | 数据类型 | 说明 |
id | int | 学生 ID |
name | varchar | 学生姓名 |
课程表(course)结构:
字段名 | 数据类型 | 说明 |
id | int | 课程 ID |
name | varchar | 课程名称 |
为了记录学生参加课程的情况,我们可以再创建一个选课表(selection),用于记录学生选修的课程信息。选课表中,使用学生 ID 和课程 ID 来关联学生和课程,同时记录学生在该门课程中的得分(score)。
选课表(selection)结构:
字段名 | 数据类型 | 说明 |
student_id | int | 学生 ID |
course_id | int | 课程 ID |
score | int | 成绩 |
根据上述表结构,下面是一条 SQL 查询语句,用于统计每门课程参加人数以及每个学生所有课程的排名情况:
SELECT c.id AS course_id, c.name AS course_name, COUNT(s.student_id) AS student_num,
s.student_id, st.name AS student_name, s.score,
(SELECT COUNT(*) FROM selection AS s2 WHERE s2.course_id = s.course_id AND s2.score > s.score) + 1 AS rank
FROM course AS c
LEFT JOIN selection AS s ON c.id = s.course_id
LEFT JOIN student AS st ON s.student_id = st.id
GROUP BY c.id, s.student_id
ORDER BY c.id, rank
该查询语句使用了 LEFT JOIN 操作符将学生表、课程表和选课表进行关联。使用 GROUP BY 子句对课程 ID 和学生 ID 进行分组,统计每门课程参加人数以及每个学生所有课程的排名情况。使用子查询来计算每个学生在该门课程中的排名情况。最后使用 ORDER BY 子句按照课程 ID 和排名进行排序。