使用MySQL相关子查询(not exists+表子查询)求选修了'刘东明' 同学选修的全部课程的学生的学号。
时间: 2023-06-11 13:05:03 浏览: 135
这是一道 SQL 查询题,可以用以下语句来解决:
SELECT DISTINCT stu_id
FROM stu_course
WHERE course_id IN (
SELECT course_id
FROM course
WHERE teacher_name = '刘东明'
)
AND NOT EXISTS (
SELECT *
FROM stu_course sc
WHERE sc.stu_id = stu_course.stu_id
AND sc.course_id NOT IN (
SELECT course_id
FROM course
WHERE teacher_name = '刘东明'
)
);
上述语句中,第一个子查询用来找到刘东明老师教授的所有课程;第二个子查询用来找到所有选修了该同学这些课程的学生,这里使用 not exists 子查询来判断学生是否选修了刘东明老师的所有课程。最终的结果是所有选修了刘东明老师全部课程的学生的学号。
相关问题
(相关子查询NOT EXISTS) 求选修了'刘东明' 同学选修的全部课程的学生的学号。
SELECT DISTINCT 学号
FROM 选课表
WHERE 课程号 IN (
SELECT 课程号
FROM 选课表
WHERE 学号 = '刘东明'
)
AND 学号 <> '刘东明'
AND NOT EXISTS (
SELECT *
FROM 选课表 AS a
WHERE a.学号 = 学生表.学号
AND a.课程号 NOT IN (
SELECT 课程号
FROM 选课表
WHERE 学号 = '刘东明'
)
)
用子查询查询至少选修了学号为0702301213的学生选修的全部课程的学生的学号。
可以使用以下 SQL 语句实现:
```
SELECT DISTINCT s1.s_id
FROM student s1
WHERE NOT EXISTS (
SELECT c_id
FROM course
WHERE c_id NOT IN (
SELECT c_id
FROM sc
WHERE s_id = '0702301213'
)
AND c_id NOT IN (
SELECT c_id
FROM sc
WHERE s_id = s1.s_id
)
)
```
解释一下这个 SQL 语句的思路:
1. 首先在 `student` 表中查询学号为 `0702301213` 的学生 `s1`。
2. 然后使用子查询找出所有选修了学号为 `0702301213` 的学生选修的全部课程的课程编号。
3. 使用 `NOT EXISTS` 子查询找出所有选修了全部这些课程的学生,即这些课程的编号全部包含在这个学生选修的课程中。
4. 最后使用 `DISTINCT` 关键字去重并只返回学生的学号。
注意,这个 SQL 语句的效率可能不太高,如果数据量很大可能会比较慢。