点击关注公众号,干货第一时间送达

再看一题。
一,需求场景
请查询表格中,至少有一门课程,与学号为"01"的学生所学课程相同的学生ID、姓名。
正确的结果是:

【温馨提示:建表语句及数据导入脚本,请翻看前面的文章:SQL 脚本案例【2】课程1比课程2成绩高的所有学生编号】
二,解决方案
【演示工具:Mysql8 + Navicat for Mysql】
还是遵守:小->大 的筛选原则
(1)先筛选学号为 "01" 的学生所学的所有课程
select c_id
from score
where s_id = '01'
结果集:

(2)再筛选没有学过这些课程的学生
注意:需要按照学生分组,因为每个学生所学课程可能多个,用每个学生所学的所有课程,去和 "01"学生所学课程比较筛选。
select s_id
from score
where c_id in
(
select c_id
from score
where s_id = '01'
)
and s_id <> '01'
group by s_id
结果集:

(3)最后,关联 student 表,展示学生姓名即可
select s_id, s_name
from student
where s_id in (
select s_id
from score
where c_id in
(
select c_id
from score
where s_id = '01'
)
and s_id <> '01'
group by s_id
)
结果集:

当然,有的小伙伴喜欢用 join,
也是可以的:
select t3.s_id, t3.s_name
from student t3
join (
select s_id
from score sc
join
(
select c_id
from score
where s_id = '01'
) t1
on sc.c_id = t1.c_id
and sc.s_id <> '01'
group by sc.s_id
) t2
on t3.s_id = t2.s_id

文章转载自皮皮克克,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




