SQL查找同时选修1号课程和3号课程的所有学生的学号、姓名、课程号和选修成绩
时间: 2023-11-16 14:11:34 浏览: 624
假设你的数据库中有一个名为 `course_registration` 的表,包含以下字段:
- `student_id`: 学生编号
- `student_name`: 学生姓名
- `course_id`: 课程编号
- `score`: 选修成绩
那么可以使用以下 SQL 语句查询同时选修了1号课程和3号课程的所有学生的学号、姓名、课程号和选修成绩:
```
SELECT student_id, student_name, course_id, score
FROM course_registration
WHERE course_id IN ('1', '3')
GROUP BY student_id
HAVING COUNT(DISTINCT course_id) = 2;
```
上述 SQL 语句使用了 `IN` 运算符来指定要查询的课程编号,然后使用 `GROUP BY` 对学生编号进行分组,使用 `HAVING` 子句过滤出同时选修了1号课程和3号课程的学生,最后从表中选出这些学生的学号、姓名、课程号和选修成绩。
相关问题
学生(学号,姓名,出生日期,性别),选修(学号,课程号,成绩),用SQL查找同时选修1号课程和3号课程的所有学生的学号、姓名、课程号和选修成绩
可以使用如下的 SQL 语句来查询同时选修1号课程和3号课程的所有学生的学号、姓名、课程号和选修成绩:
```sql
SELECT 学生.学号, 学生.姓名, 选修.课程号, 选修.成绩
FROM 学生
INNER JOIN 选修 ON 学生.学号 = 选修.学号
WHERE 选修.课程号 IN ('1', '3')
GROUP BY 学生.学号, 学生.姓名, 选修.课程号, 选修.成绩
HAVING COUNT(DISTINCT 选修.课程号) = 2
```
这里使用了 INNER JOIN 连接了两个表,WHERE 子句筛选了同时选修了1号课程和3号课程的学生,GROUP BY 和 HAVING 子句用于确保一个学生同时选修了1号课程和3号课程。
(1)用并操作查询选修了1号课程或者选修了3号课程的学生的学号 (2)用交操作查询即选修了1号课程又选修了3号课程的学生的学号 (3)用差操作查询没有选修1号课程的学生的学号 (4)用派生表查询考试成绩不及格的学生姓名 \
在数据库操作中,这些查询可以使用SQL语言来表示:
1. **并操作 (UNION)**: 查询选修了1号课程 (`course_id = 1`) 或者选修了3号课程 (`course_id = 3`) 的学生学号,假设有一个名为 `students` 的表,其中包含 `student_id` 和 `course_id` 字段。
```sql
SELECT student_id
FROM students
WHERE course_id IN (1, 3)
```
2. **交操作 (INTERSECT)**: 查询既选修了1号课程又选修了3号课程的学生学号。由于 SQL 中没有直接的 INTERSECT 操作,需要借助子查询和 EXISTS 关键字。
```sql
SELECT s1.student_id
FROM students s1
INNER JOIN students s2 ON s1.student_id = s2.student_id AND s1.course_id = 1
WHERE s2.course_id = 3
```
3. **差操作 (EXCEPT)**: 查询没有选修1号课程的学生学号。同样因为 SQL 的限制,我们首先找出所有选修了1号课程的学生,然后从所有学生中排除他们。
```sql
SELECT student_id
FROM students
WHERE course_id != 1
EXCEPT
SELECT student_id
FROM students
WHERE course_id = 1
```
4. **派生表查询 (Derived Table)**: 假设 `grades` 表记录学生的成绩,我们需要查询不及格的学生(通常不及格分数设置为某个值如 `score < 60`)姓名,假设 `student_name` 存在于 `students` 表中。
```sql
SELECT s.student_name
FROM students s
JOIN grades g ON s.student_id = g.student_id
WHERE g.score < 60
```
阅读全文