查询所有学生的选修情况,要求包括选修了课程的学生和没有选修任何课程的学生,显示他们的学号,姓名,课程编号,成绩
时间: 2024-11-23 19:39:40 浏览: 7
查询所有学生的选修情况,通常涉及到数据库操作,需要访问学生表(包含学号、姓名等基本信息)和课程选择表(关联学号和课程编号,以及成绩)。下面是一个简单的SQL查询示例:
```sql
SELECT s.student_id, s.name AS 学生姓名, c.course_code AS 课程编号, sc.score AS 成绩
FROM students s
LEFT JOIN student_courses sc ON s.student_id = sc.student_id
JOIN courses c ON sc.course_id = c.course_id
UNION ALL
SELECT s.student_id, s.name, NULL AS 课程编号, NULL AS 成绩
FROM students s
WHERE NOT EXISTS (SELECT * FROM student_courses WHERE student_courses.student_id = s.student_id);
```
这个查询做了两部分:
1. `LEFT JOIN` 将学生表(s)与课程选择表(sc)连接,获取有选课记录的学生信息,同时关联课程(c)数据。
2. 使用 `NOT EXISTS` 条件,从学生表中筛选出没有任何课程选择的学生。
结果将包括所有学生的学号、姓名、已选课程的课程编号及成绩,如果某学生没选课,则课程编号和成绩为NULL。
相关问题
查询所有学生的选修情况,要求包括选修了课程的学生和没有选修课程的学生,显示他们的学号,姓名,课程号,成绩
为了获取所有学生的选修情况,包括已选课学生和未选课学生的信息,我们需要查询两个部分:已经选课的学生和没有选课的学生。这通常需要两个关联的查询,假设我们有两个表,一个是"Students",存储基本信息如学号和姓名;另一个是"CourseEnrollment",记录学生选课的情况,以及关联的课程信息。
1. 对于已选课学生:
```sql
SELECT s.StudentID, s.Name, ce.CourseCode, ce.Grade
FROM Students s
JOIN CourseEnrollment ce ON s.StudentID = ce.StudentID;
```
2. 对于未选课学生(这里假设没有选课的学生在"CoursEnrollment"表中无记录):
```sql
SELECT s.StudentID, s.Name, NULL AS CourseCode, NULL AS Grade
FROM Students s
LEFT JOIN CourseEnrollment ce ON s.StudentID = ce.StudentID
WHERE ce.StudentID IS NULL;
```
上述查询先通过INNER JOIN获取已选课学生的信息,再通过LEFT JOIN获取所有学生,将没有选课的学生也包含进来,课程号和成绩设为NULL。
多表连接查询 (1) 查询选修了【数据库原理】的计算机系的学生学号和姓名。 (2) 查询每一门课的间接先行课(即先行课的先行课),显示课程编号和该门课程的间接先行课编号。 (3) 查询学生的学号、姓名、选修课程的名称和成绩。 (4) 查询选修了课程的学生姓名。 (5) 查询所有学生的信息和所选修的课程, 要求显示学生的学号、姓名、课程号及课程名。没有选课的同学对应的选课信息为空。 (6) 查询所有课程的课程编号、课程名称及选课人数,没有被选的课程选课人数显示为0。 (7) 列出所有学生所有可能的选修情况,要求显示学生的学号、姓名、课程号及课程名。 (8) 查找计算机系的学生选修课程数大于2 的学生的姓名、 平均成绩和选课门数,并按平均成绩降序排列。
1.
```
SELECT s.id, s.name
FROM student s
JOIN course_selection cs ON s.id = cs.student_id
JOIN course c ON cs.course_id = c.id
WHERE s.department = '计算机系'
AND c.name = '数据库原理';
```
2.
```
WITH RECURSIVE prerequisites AS (
SELECT course_id, prerequisite_id
FROM prerequisite
UNION
SELECT p.course_id, pr.prerequisite_id
FROM prerequisites pr
JOIN prerequisite p ON pr.course_id = p.prerequisite_id
)
SELECT c.id, pr.prerequisite_id
FROM course c
LEFT JOIN prerequisites pr ON c.id = pr.course_id;
```
3.
```
SELECT s.id, s.name, c.name, cs.grade
FROM student s
JOIN course_selection cs ON s.id = cs.student_id
JOIN course c ON cs.course_id = c.id;
```
4.
```
SELECT s.name
FROM student s
JOIN course_selection cs ON s.id = cs.student_id;
```
5.
```
SELECT s.id, s.name, c.id, c.name
FROM student s
LEFT JOIN course_selection cs ON s.id = cs.student_id
LEFT JOIN course c ON cs.course_id = c.id;
```
6.
```
SELECT c.id, c.name, COUNT(cs.student_id) AS num_students
FROM course c
LEFT JOIN course_selection cs ON c.id = cs.course_id
GROUP BY c.id, c.name;
```
7.
```
SELECT s.id, s.name, c.id, c.name
FROM student s
CROSS JOIN course c;
```
8.
```
WITH course_counts AS (
SELECT s.id, s.name, COUNT(cs.course_id) AS num_courses
FROM student s
JOIN course_selection cs ON s.id = cs.student_id
WHERE s.department = '计算机系'
GROUP BY s.id, s.name
HAVING COUNT(cs.course_id) > 2
),
average_grades AS (
SELECT s.id, AVG(cs.grade) AS avg_grade
FROM student s
JOIN course_selection cs ON s.id = cs.student_id
GROUP BY s.id
)
SELECT cc.name, ag.avg_grade, cc.num_courses
FROM course_counts cc
JOIN average_grades ag ON cc.id = ag.id
ORDER BY ag.avg_grade DESC;
```
阅读全文